Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics...

174
Hynek Schlawack Get Instrumented How Prometheus Can Unify Your Metrics

Transcript of Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics...

Page 1: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Hynek Schlawack

Get Instrumented How Prometheus Can Unify Your Metrics

Page 2: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goals

Page 3: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goals

Page 4: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goals

Page 5: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goals

Page 6: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goals

Page 7: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Service Level

Page 8: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Service Level Indicator

Page 9: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Service Level IndicatorObjective

Page 10: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Service Level IndicatorObjective(Agreement)

Page 11: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics

Page 12: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics

avg latency 0.3 0.5 0.8 1.1 2.6

Page 13: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics

12:00 12:01 12:02 12:03 12:04

avg latency 0.3 0.5 0.8 1.1 2.6

Page 14: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics

12:00 12:01 12:02 12:03 12:04

avg latency 0.3 0.5 0.8 1.1 2.6server load 0.3 1.0 2.3 3.5 5.2

Page 15: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 16: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Instrument

Page 17: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Instrument

Page 18: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Instrument

Page 19: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Instrument

Page 20: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Instrument

Page 21: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 22: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 23: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metric Types

Page 24: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metric Types❖ counter

Page 25: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metric Types❖ counter❖ gauge

Page 26: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metric Types❖ counter❖ gauge

❖ summary

Page 27: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metric Types❖ counter❖ gauge

❖ summary❖ histogram

Page 28: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metric Types❖ counter❖ gauge

❖ summary❖ histogram❖ buckets (1s,

0.5s, 0.25, …)

Page 29: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Averages

Page 30: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

❖ avg(request time) ≠ avg(UX)

Averages

Page 31: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

❖ avg(request time) ≠ avg(UX)❖ avg({1, 1, 1, 1, 10}) = 2.8

Averages

Page 32: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

❖ avg(request time) ≠ avg(UX)❖ avg({1, 1, 1, 1, 10}) = 2.8

Averages

Page 33: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

❖ avg(request time) ≠ avg(UX)❖ avg({1, 1, 1, 1, 10}) = 2.8

Averages

Page 34: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

❖ avg(request time) ≠ avg(UX)❖ avg({1, 1, 1, 1, 10}) = 2.8

❖ median({1, 1, 1, 1, 10}) = 1

Averages

Page 35: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

❖ avg(request time) ≠ avg(UX)❖ avg({1, 1, 1, 1, 10}) = 2.8

❖ median({1, 1, 1, 1, 10}) = 1

Averages

Page 36: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

❖ avg(request time) ≠ avg(UX)❖ avg({1, 1, 1, 1, 10}) = 2.8

❖ median({1, 1, 1, 1, 10}) = 1❖ median({1, 1, 100_000}) = 1

Averages

Page 37: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentiles

Page 38: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentiles

nth percentile P of a data set=

P ≥ n% of values

Page 39: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 40: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

50th percentile = 1 ms

Page 41: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

50th percentile = 1 ms

50% of requests done by 1 ms

Page 42: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentiles

Page 43: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

PercentilesP {1, 1, 100_000}

50th 1

Page 44: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

PercentilesP {1, 1, 100_000}

50th 1

95th 90_000

Page 45: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Naming

Page 46: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Namingbackend1_app_http_reqs_msgs_postbackend1_app_http_reqs_msgs_get…

Page 47: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Namingbackend1_app_http_reqs_msgs_postbackend1_app_http_reqs_msgs_get…app_http_reqs_total

Page 48: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Namingbackend1_app_http_reqs_msgs_postbackend1_app_http_reqs_msgs_get…app_http_reqs_total

Page 49: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Namingbackend1_app_http_reqs_msgs_postbackend1_app_http_reqs_msgs_get…app_http_reqs_total

Page 50: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Namingbackend1_app_http_reqs_msgs_postbackend1_app_http_reqs_msgs_get…app_http_reqs_total{meth="POST", path="/msgs", backend="1"}app_http_reqs_total{meth="GET", path="/msgs", backend="1"}…

app_http_reqs_total

Page 51: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 52: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 53: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

1. resolution = scraping interval

Page 54: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

1. resolution = scraping interval2. missing scrapes = less resolution

Page 55: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Problems

❖ short lived jobs

Page 56: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 57: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Problems

❖ short lived jobs❖ target discovery

Page 58: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Configurationscrape_configs: - job_name: 'prometheus' static_configs: - targets: - 'localhost:9090'

Page 59: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Configurationscrape_configs: - job_name: 'prometheus' static_configs: - targets: - 'localhost:9090'

Page 60: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Configurationscrape_configs: - job_name: 'prometheus' static_configs: - targets: - 'localhost:9090'

Page 61: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Configurationscrape_configs: - job_name: 'prometheus' static_configs: - targets: - 'localhost:9090'

{instance="localhost:9090",job="prometheus"}

Page 62: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 63: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Problems

❖ target discovery❖ short lived jobs❖ Heroku/NATed systems

Page 64: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Advantages

Page 65: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Advantages❖ multiple Prometheis easy

Page 66: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Advantages❖ multiple Prometheis easy❖ outage detection

Page 67: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Advantages❖ multiple Prometheis easy❖ outage detection❖ predictable, no self-DoS

Page 68: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Pull: Advantages❖ multiple Prometheis easy❖ outage detection❖ predictable, no self-DoS❖ easy to instrument 3rd parties

Page 69: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics Format# HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds histogram req_seconds_count 390.0 req_seconds_sum 177.0319407

Page 70: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics Format# HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds histogram req_seconds_count 390.0 req_seconds_sum 177.0319407

Page 71: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics Format# HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds histogram req_seconds_count 390.0 req_seconds_sum 177.0319407

Page 72: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics Format# HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds histogram req_seconds_count 390.0 req_seconds_sum 177.0319407

Page 73: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Metrics Format# HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds histogram req_seconds_count 390.0 req_seconds_sum 177.0319407

Page 74: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentilesreq_seconds_bucket{le="0.05"} 0.0 req_seconds_bucket{le="0.25"} 1.0 req_seconds_bucket{le="0.5"} 273.0 req_seconds_bucket{le="0.75"} 369.0 req_seconds_bucket{le="1.0"} 388.0 req_seconds_bucket{le="2.0"} 390.0 req_seconds_bucket{le="+Inf"} 390.0

Page 75: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentilesreq_seconds_bucket{le="0.05"} 0.0 req_seconds_bucket{le="0.25"} 1.0 req_seconds_bucket{le="0.5"} 273.0 req_seconds_bucket{le="0.75"} 369.0 req_seconds_bucket{le="1.0"} 388.0 req_seconds_bucket{le="2.0"} 390.0 req_seconds_bucket{le="+Inf"} 390.0

Page 76: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentilesreq_seconds_bucket{le="0.05"} 0.0 req_seconds_bucket{le="0.25"} 1.0 req_seconds_bucket{le="0.5"} 273.0 req_seconds_bucket{le="0.75"} 369.0 req_seconds_bucket{le="1.0"} 388.0 req_seconds_bucket{le="2.0"} 390.0 req_seconds_bucket{le="+Inf"} 390.0

Page 77: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 78: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Aggregation

Page 79: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Aggregation

sum( rate( req_seconds_count[1m] ) )

Page 80: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Aggregation

sum( rate( req_seconds_count[1m] ) )

Page 81: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Aggregation

sum( rate( req_seconds_count[1m] ) )

Page 82: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Aggregation

sum( rate( req_seconds_count[1m] ) )

Page 83: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Aggregation

sum( rate( req_seconds_count{dc="west"}[1m] ) )

Page 84: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Aggregation

sum( rate( req_seconds_count[1m] ) ) by (dc)

Page 85: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentileshistogram_quantile( 0.9, rate( req_seconds_bucket[10m] ))

Page 86: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentileshistogram_quantile( 0.9, rate( req_seconds_bucket[10m] ))

Page 87: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentileshistogram_quantile( 0.9, rate( req_seconds_bucket[10m] ))

Page 88: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentileshistogram_quantile( 0.9, rate( req_seconds_bucket[10m] ))

Page 89: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Percentileshistogram_quantile( 0.9, rate( req_seconds_bucket[10m] ))

Page 90: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 91: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 92: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Internal

Page 93: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Internal

❖ great for ad-hoc

Page 94: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Internal

❖ great for ad-hoc❖ 1 expr per graph

Page 95: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Internal

❖ great for ad-hoc❖ 1 expr per graph❖ templating

Page 96: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

PromDash

Page 97: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

PromDash

❖ best integration

Page 98: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

PromDash

❖ best integration❖ former official

Page 99: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

PromDash

❖ best integration❖ former official❖ now deprecated

❖ don’t bother

Page 100: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Grafana

Page 101: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Grafana

❖ pretty & powerful

Page 102: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Grafana

❖ pretty & powerful❖ many integrations

Page 103: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Grafana

❖ pretty & powerful❖ many integrations❖ mix and match!

Page 104: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Grafana

❖ pretty & powerful❖ many integrations❖ mix and match!

❖ use this!

Page 105: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 106: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Alerts & Scrying

Page 107: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Alerts & Scrying

ALERT DiskWillFillIn4Hours IF predict_linear( node_filesystem_free[1h], 4*3600) < 0 FOR 5m

Page 108: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Alerts & Scrying

ALERT DiskWillFillIn4Hours IF predict_linear( node_filesystem_free[1h], 4*3600) < 0 FOR 5m

Page 109: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Alerts & Scrying

ALERT DiskWillFillIn4Hours IF predict_linear( node_filesystem_free[1h], 4*3600) < 0 FOR 5m

Page 110: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Alerts & Scrying

ALERT DiskWillFillIn4Hours IF predict_linear( node_filesystem_free[1h], 4*3600) < 0 FOR 5m

Page 111: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Alerts & Scrying

ALERT DiskWillFillIn4Hours IF predict_linear( node_filesystem_free[1h], 4*3600) < 0 FOR 5m

Page 112: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Alerts & Scrying

ALERT DiskWillFillIn4Hours IF predict_linear( node_filesystem_free[1h], 4*3600) < 0 FOR 5m

Page 113: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 114: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 115: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 116: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Environment

Page 117: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 118: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Apache

nginx

Django

PostgreSQL

MySQL

MongoDB

CouchDB

redis

Varnish

etcd

Kubernetes

Consul

collectd

HAProxy

statsdgraphite

InfluxDBSNMP

Page 119: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Apache

nginx

Django

PostgreSQL

MySQL

MongoDB

CouchDB

redis

Varnish

etcd

Kubernetes

Consul

collectd

HAProxy

statsdgraphite

InfluxDBSNMP

Page 120: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

node_exporter

Page 121: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

node_exportercAdvisor

Page 122: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

System Insight❖ load❖ procs

❖ memory❖ network

❖ disk❖ I/O

Page 123: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

mtail

Page 124: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

mtail

❖ follow (log) files

Page 125: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

mtail

❖ follow (log) files❖ extract metrics using regex

Page 126: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

mtail

❖ follow (log) files❖ extract metrics using regex❖ can be better than direct

Page 127: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Moar

Page 128: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Moar❖ Edges: web servers/HAProxy

Page 129: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Moar❖ Edges: web servers/HAProxy❖ black box

Page 130: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Moar❖ Edges: web servers/HAProxy❖ black box❖ databases

Page 131: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Moar❖ Edges: web servers/HAProxy❖ black box❖ databases❖ network

Page 132: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

So Far

Page 133: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

So Far

❖ system stats

Page 134: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

So Far

❖ system stats❖ outside look

Page 135: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

So Far

❖ system stats❖ outside look❖ 3rd party components

Page 136: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Code

Page 137: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

cat-or.not

Page 138: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

cat-or.not

❖HTTP service

Page 139: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

cat-or.not

❖HTTP service❖upload picture

Page 140: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

cat-or.not

❖HTTP service❖upload picture❖meow!/nope meo

w!

Page 141: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

from flask import Flask, g, request from cat_or_not import is_cat

app = Flask(__name__)

@app.route("/analyze", methods=["POST"]) def analyze(): g.auth.check(request)

return ("meow!" if is_cat(request.files["pic"]) else "nope!")

if __name__ == "__main__": app.run()

Page 142: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

from flask import Flask, g, request from cat_or_not import is_cat

app = Flask(__name__)

@app.route("/analyze", methods=["POST"]) def analyze(): g.auth.check(request)

return ("meow!" if is_cat(request.files["pic"]) else "nope!")

if __name__ == "__main__": app.run()

Page 143: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

from flask import Flask, g, request from cat_or_not import is_cat

app = Flask(__name__)

@app.route("/analyze", methods=["POST"]) def analyze(): g.auth.check(request)

return ("meow!" if is_cat(request.files["pic"]) else "nope!")

if __name__ == "__main__": app.run()

Page 144: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

pip install prometheus_client

Page 145: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

from prometheus_client import \ start_http_server # … if __name__ == "__main__": start_http_server(8000) app.run()

Page 146: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

process_virtual_memory_bytes 156393472.0 process_resident_memory_bytes 20480000.0 process_start_time_seconds 1460214325.21 process_cpu_seconds_total 0.169999999998 process_open_fds 8.0 process_max_fds 1024.0

Page 147: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

process_virtual_memory_bytes 156393472.0 process_resident_memory_bytes 20480000.0 process_start_time_seconds 1460214325.21 process_cpu_seconds_total 0.169999999998 process_open_fds 8.0 process_max_fds 1024.0

Page 148: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

process_virtual_memory_bytes 156393472.0 process_resident_memory_bytes 20480000.0 process_start_time_seconds 1460214325.21 process_cpu_seconds_total 0.169999999998 process_open_fds 8.0 process_max_fds 1024.0

Page 149: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

process_virtual_memory_bytes 156393472.0 process_resident_memory_bytes 20480000.0 process_start_time_seconds 1460214325.21 process_cpu_seconds_total 0.169999999998 process_open_fds 8.0 process_max_fds 1024.0

Page 150: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

process_virtual_memory_bytes 156393472.0 process_resident_memory_bytes 20480000.0 process_start_time_seconds 1460214325.21 process_cpu_seconds_total 0.169999999998 process_open_fds 8.0 process_max_fds 1024.0

Page 151: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

process_virtual_memory_bytes 156393472.0 process_resident_memory_bytes 20480000.0 process_start_time_seconds 1460214325.21 process_cpu_seconds_total 0.169999999998 process_open_fds 8.0 process_max_fds 1024.0

Page 152: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds
Page 153: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

from prometheus_client import \ Histogram, Gauge

REQUEST_TIME = Histogram( "cat_or_not_request_seconds", "Time spent in HTTP requests.")

Page 154: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

from prometheus_client import \ Histogram, Gauge

REQUEST_TIME = Histogram( "cat_or_not_request_seconds", "Time spent in HTTP requests.")ANALYZE_TIME = Histogram( "cat_or_not_analyze_seconds", "Time spent analyzing pictures.")

Page 155: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

from prometheus_client import \ Histogram, Gauge

REQUEST_TIME = Histogram( "cat_or_not_request_seconds", "Time spent in HTTP requests.")ANALYZE_TIME = Histogram( "cat_or_not_analyze_seconds", "Time spent analyzing pictures.")IN_PROGRESS = Gauge( "cat_or_not_in_progress_requests", "Number of requests in progress.")

Page 156: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

@app.route("/analyze", methods=["POST"]) @IN_PROGRESS.track_inprogress() @REQUEST_TIME.time() def analyze(): g.auth.check(request) with ANALYZE_TIME.time(): result = is_cat( request.files["pic"].stream)

return "meow!" if result else "nope!"

Page 157: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

@app.route("/analyze", methods=["POST"]) @IN_PROGRESS.track_inprogress() @REQUEST_TIME.time() def analyze(): g.auth.check(request) with ANALYZE_TIME.time(): result = is_cat( request.files["pic"].stream)

return "meow!" if result else "nope!"

Page 158: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

AUTH_TIME = Histogram("auth_seconds", "Time spent authenticating.") AUTH_ERRS = Counter("auth_errors_total", "Errors while authing.") AUTH_WRONG_CREDS = Counter("auth_wrong_creds_total", "Wrong credentials.")

class Auth: # ... @AUTH_TIME.time() def auth(self, request): while True: try: return self._auth(request) except WrongCredsError: AUTH_WRONG_CREDS.inc() raise except Exception: AUTH_ERRS.inc()

Page 159: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

AUTH_TIME = Histogram("auth_seconds", "Time spent authenticating.") AUTH_ERRS = Counter("auth_errors_total", "Errors while authing.") AUTH_WRONG_CREDS = Counter("auth_wrong_creds_total", "Wrong credentials.")

class Auth: # ... @AUTH_TIME.time() def auth(self, request): while True: try: return self._auth(request) except WrongCredsError: AUTH_WRONG_CREDS.inc() raise except Exception: AUTH_ERRS.inc()

Page 160: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

AUTH_TIME = Histogram("auth_seconds", "Time spent authenticating.") AUTH_ERRS = Counter("auth_errors_total", "Errors while authing.") AUTH_WRONG_CREDS = Counter("auth_wrong_creds_total", "Wrong credentials.")

class Auth: # ... @AUTH_TIME.time() def auth(self, request): while True: try: return self._auth(request) except WrongCredsError: AUTH_WRONG_CREDS.inc() raise except Exception: AUTH_ERRS.inc()

Page 161: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

AUTH_TIME = Histogram("auth_seconds", "Time spent authenticating.") AUTH_ERRS = Counter("auth_errors_total", "Errors while authing.") AUTH_WRONG_CREDS = Counter("auth_wrong_creds_total", "Wrong credentials.")

class Auth: # ... @AUTH_TIME.time() def auth(self, request): while True: try: return self._auth(request) except WrongCredsError: AUTH_WRONG_CREDS.inc() raise except Exception: AUTH_ERRS.inc()

Page 162: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

@app.route("/analyze", methods=["POST"]) def analyze(): g.auth.check(request) with ANALYZE_TIME.time(): result = is_cat( request.files["pic"].stream)

return "meow!" if result else "nope!"

Page 163: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

pip install prometheus_async

Page 164: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Wrapperfrom prometheus_async.aio import time

@time(REQUEST_TIME) async def view(request): # ...

Page 165: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goodies

Page 166: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goodies

❖ aiohttp-based metrics export

Page 167: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goodies

❖ aiohttp-based metrics export❖ also in thread!

Page 168: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Goodies

❖ aiohttp-based metrics export❖ also in thread!

❖ Consul Agent integration

Page 169: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Wrap Up

Page 170: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Wrap Up

Page 171: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Wrap Up

Page 172: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Wrap Up

✓ ✓

Page 173: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

Wrap Up

✓ ✓✓

Page 174: Get Instrumented - EuroPython · req_seconds_count 390.0 req_seconds_sum 177.0319407. Metrics Format # HELP req_seconds Time spent \ processing a request in seconds. # TYPE req_seconds

ox.cx/[email protected]