More Related Content Similar to Prometheus入門から運用まで徹底解説 (20) Prometheus入門から運用まで徹底解説8. データのフォーマット
• 大量の収集を行うためにメトリックスのフォーマット
は標準化されている必要がある
• key/value式のプレーンテキストを返す
• スキーマ―を持たないテキストベースのインターフェ
イスが追加の障壁を低くする
go_gc_duration_seconds{quantile="0"} 8.007600000000001e-05
go_gc_duration_seconds{quantile="0.25"} 0.000297585
go_gc_duration_seconds{quantile="0.5"} 0.00030774400000000004
go_gc_duration_seconds{quantile="0.75"} 0.000317933
go_gc_duration_seconds{quantile="1"} 0.004497566000000001
go_gc_duration_seconds_sum 1059.847743361
Borgmanと同様の仕様
13. クエリ式
• クエリを実行するとベクタ内で最新の値をもつ行が返
される
• 期間を指定することができる
Borgmanと同様の仕様
{var=http_requests,job=webserver,instance=host0:80,service=web,zone=us-west} 10
{var=http_requests,job=webserver,instance=host1:80,service=web,zone=us-west} 9
{var=http_requests,job=webserver,instance=host2:80,service=web,zone=us-west} 11
{var=http_requests,job=webserver,instance=host3:80,service=web,zone=us-west} 0
{var=http_requests,job=webserver,instance=host4:80,service=web,zone=us-west} 10
{var=http_requests,job=webserver,service=web,zone=us-west}[10m]
{var=http_requests,job=webserver,instance=host0:80, ...} 0 1 2 3 4 5 6 7 8 9 10
24. 設定:Prometheus.yml
• Service Discoveryを利用する
• EC2をTargetにしてみる
• localhostも対象にしてみる
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
ec2_sd_configs:
- region: ap-northeast-1
access_key:
secret_key:
port: 9100
relabel_configs:
- source_labels: [__meta_ec2_tag_Name]
target_label: instance
25. exporterを動かす
• 監視対象でexporterを動かします
• node_exporter: *NIXカーネル用のハードウェアとOSのメト
リックス収集。
node_exporter --
collectors.enabled="conntrack,diskstats,entropy,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,
stat,textfile,time,vmstat" >/dev/null 2>&1 &
30. 手動でtaarget設定する
• 新しいサーバー追加するとConfig更新が必要
• バージョンミスマッチ
• サーバーの喪失 scrape_configs:
- job_name: microservice1
target_groups:
- targets: [‘server1:8003’]
- targets: [‘server2:8003’]
- targets: [‘server3:8003’]
- targets: [‘server4:8003’]
- job_name: otherjob
target_groups:
- targets: [‘server3:8086’]
- targets: [‘server4:8087’]
31. Service Discovery
• DNS
• Consul / Azure / ec2
• ファイル
- job_name: pandora-exporter_nbg1
target_groups:
dns_sd_configs:
consul_sd_configs:
- server: 127.0.0.1:8500
datacenter: nbg1
services:
- pandora-exporter
- job_name: service2-exporter_fra1
target_groups:
dns_sd_configs:
consul_sd_configs:
- server: 127.0.0.1:8500
datacenter: fra1
services:
- service2-exporter
32. 提供されているSD
• azure
• consul
• dns
• ec2
• file
• gce
• kubernetes
• marathon
• openstack
• triton
• zookeeper : nerve_sd_config / serverset_sd_config
59. PromQL
SQL:
SELECT errors.job, errors.instance, […more labels…],
errors.value / total.value
FROM errors, total
WHERE errors.job=”foo” AND total.job=”foo” JOIN
[…some more complicated stuff here…]
PromQL:
errors{job=”foo”} / total{job=”foo”}
73. ALERT <alert name>
IF <PromQL vector expression>
FOR <duration>
LABELS { ... }
ANNOTATIONS { ... }
<elem1> <val1>
<elem2> <val2>
<elem3> <val3>
...
結果毎に一つのアラート
74. ALERT EtcdNoLeader
IF etcd_has_leader == 0
FOR 1m
LABELS {
severity=”page”
}
{job=”etcd”,alertname=”EtcdNoLeader”,severity=”page”,instance=”A”}
{job=”etcd”,alertname=”EtcdNoLeader”,severity=”page”,instance=”B”}
{job=”etcd”,instance=”A”} 0.0
{job=”etcd”,instance=”B”} 0.0
絞り込んだ結果
アラート発火
80. ALERT HighErrorRate
IF sum rate(request_errors_total[5m]) /
sum rate(requests_total[5m]) * 100 > 1
{} 1.8354
高エラー/低トラフィック
低エラー/高トラフィック
合計
81. ALERT HighErrorRate
IF sum by(instance, path) rate(request_errors_total[5m]) /
sum by(instance, path) rate(requests_total[5m]) * 100 > 0.01
{instance=”web-2”, path=”/api/comments”} 2.435
{instance=”web-1”, path=”/api/comments”} 1.0055
{instance=”web-2”, path=”/api/profile”} 34.124
アラート発火
82. ALERT HighErrorRate
IF sum by(instance, path) rate(request_errors_total[5m]) /
sum by(instance, path) rate(requests_total[5m]) * 100 > 0.01
{instance=”web-2”, path=”/api/v1/comments”} 2.435
アラート発火
インスタンス1
インスタンス2~100
83. ALERT HighErrorRate
IF sum without(instance) rate(request_errors_total[5m]) /
sum without(instance) rate(requests_total[5m]) * 100 > 1
{method=”GET”, path=”/api/v1/comments”} 2.435
{method=”POST”, path=”/api/v1/comments”} 1.0055
{method=”POST”, path=”/api/v1/profile”} 34.124
アラート発火
86. アラートルール アラートルール アラートルール アラートルール
04:11 hey, HighLatency, service=”X”, zone=”eu-west”, path=/user/profile, method=GET
04:11 hey, HighLatency, service=”X”, zone=”eu-west”, path=/user/settings, method=GET
04:11 hey, HighLatency, service=”X”, zone=”eu-west”, path=/user/settings, method=GET
04:11 hey, HighErrorRate, service=”X”, zone=”eu-west”, path=/user/settings, method=POST
04:12 hey, HighErrorRate, service=”X”, zone=”eu-west”, path=/user/profile, method=GET
04:13 hey, HighLatency, service=”X”, zone=”eu-west”, path=/index, method=POST
04:13 hey, CacheServerSlow, service=”X”, zone=”eu-west”, path=/user/profile, method=POST
. . .
04:15 hey, HighErrorRate, service=”X”, zone=”eu-west”, path=/comments, method=GET
04:15 hey, HighErrorRate, service=”X”, zone=”eu-west”, path=/user/profile, method=POST
87. アラートルール アラートルール アラートルール アラートルール
Alert Manager
zone eu-west でServiceXで15個のイ
ンシデント発生
3x HighLatency
10x HighErrorRate
2x CacheServerSlow
個々のアラート: ...
Chat
JIRA
PagerDuty
88. Alertmanagerのアラート群
route:
receiver: infra # default receiver
group_by: ['alertname', 'Service', 'Stage', 'Role']
group_wait: 30s # wait for aggregating alert
group_interval: 5m # wait for alert (next time)
repeat_interval: 3h # wait for alert (re-sending same one)
同じアラート、
同じサービス、
同じステージ、
同じロール
が30秒以内に来たら、同じアラートとみなす
5分毎にアラート発砲する
次回送信されるのは、3時間後
90. {alertname=”DatacenterOnFire”, severity=”huge-page”, zone=”eu-west”}
{alertname=”LatencyHigh”, severity=”page”, ..., zone=”eu-west”}
...
{alertname=”LatencyHigh”, severity=”page”, ..., zone=”eu-west”}
{alertname=”ErrorsHigh”, severity=”page”, ..., zone=”eu-west”}
...
{alertname=”ServiceDown”, severity=”page”, ..., zone=”eu-west”}
アクティブになったら、
同一リージョンのすべてのアラートをミュートにする