Wojciech Wójcik: W temacie monitorowania systemów IT powiedziano już oceany słów na niezliczonych prezentacjach. Przedstawię wam jednak opowieść o mitologicznym Prometheuszu. Opowieść, która mogłaby konkurować z Grą o tron, a Koronę Królów zjadłaby na przystawkę. W jej trakcie zdradzę wam sekrety monitorowania Kubernetes, ale i nie tylko. Miejcie jednak na uwadze, że nie wszystkie potyczki się wygrywa – dzięki czemu zaszczycę was też możliwością wysłuchania ciekawych historii o fuckupach.
2. W odcinku wystąpią:
• W roli głównej: Prometheus
• Jakże ważne role drugoplanowe: Grafana, Telegraf
• Statyści:
• k8s
• istio
• knative
• rabbitmq
• mysql
• giełdy cryptowalut
• zapomniany host z asterisk pbx
• lamerskie apki w golang
3. Prometheus
• Narzędzie do zbierania oraz obróbki metryk
• Możliwość pobierania wielu źródeł danych (serwisy, dane
z instancji, aplikacje)
• Praca z danymi wysyłanymi do niego za pośrednictwem
push-gateway (np zadania typu cron, serverless)
• Zarządzanie alertami
• Spora ilość gotowych integracji oraz możliwość tworzenia
własnych rozwiązań
4. Prometheus-operator
• łatwa instalacja (helm - https://github.com/helm/charts/tree/
master/stable/prometheus-operator)
• dużo domyślnie skonfigurowanych metryk, alertów
• sporo przydatnych gotowców dla grafany
• możliwość instalacji wielu instancji w jednym klastrze ( różne
dane, retencja danych, storage Thanos - https://github.com/
improbable-eng/thanos)
• definiowanie własnych metryk oraz alertów przez
developerów, które mogą zasilać różne instancje prometheus
7. templateFiles:
notifications_slack.tmpl: |-
{{ define "__single_message_title" }}{{ range .Alerts.Firing }}{{ .Labels.alertname }} @
{{ .Annotations.identifier }}{{ end }}{{ range .Alerts.Resolved }}{{ .Labels.alertname }} @
{{ .Annotations.identifier }}{{ end }}{{ end }}
{{ define "custom_title" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{
end }}] {{ if or (and (eq (len .Alerts.Firing) 1) (eq (len .Alerts.Resolved) 0)) (and (eq (len .Alerts.Firing)
0) (eq (len .Alerts.Resolved) 1)) }}{{ template "__single_message_title" . }}{{ end }}{{ end }}
{{ define "custom_slack_message" }}
{{ if or (and (eq (len .Alerts.Firing) 1) (eq (len .Alerts.Resolved) 0)) (and (eq (len .Alerts.Firing) 0)
(eq (len .Alerts.Resolved) 1)) }}
{{ range .Alerts.Firing }}{{ .Annotations.message }}{{ end }}{{ range .Alerts.Resolved }}
{{ .Annotations.message }}{{ end }}
{{ else }}
{{ if gt (len .Alerts.Firing) 0 }}
*Alerts Firing:*
{{ range .Alerts.Firing }}- {{ .Annotations.message }}
{{ end }}{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
*Alerts Resolved:*
{{ range .Alerts.Resolved }}- {{ .Annotations.message }}
{{ end }}{{ end }}
{{ end }}
{{ end }}
8.
9. Dodanie danych do prometheus
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nats-exporter
namespace: monitoring
labels:
release: prometheus-operator
spec:
selector:
matchLabels:
app.kubernetes.io/name: prometheus-nats-exporter
endpoints:
- port: http
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: prometheus-operator-kube-prometheus-node-alerting.rules
spec:
groups:
- name: kube-prometheus-node-alerting.rules
rules:
- alert: NodeDiskRunningFull
annotations:
message: Device {{ $labels.device }} of node-exporter {{ $labels.namespace
}}/{{ $labels.pod }} will be full within the next 24 hours.
expr: '(node:node_filesystem_usage: > 0.85) and (predict_linear(node:node_filesystem_avail:[6h],
3600 * 24) < 0)'
for: 30m
labels:
severity: warning
- alert: NodeDiskRunningFull
annotations:
message: Device {{ $labels.device }} of node-exporter {{ $labels.namespace
}}/{{ $labels.pod }} will be full within the next 2 hours.
expr: '(node:node_filesystem_usage: > 0.85) and (predict_linear(node:node_filesystem_avail:[30m],
3600 * 2) < 0)'
for: 10m
labels:
severity: critical
10. Pacjent RabbitMQ
• Skalowanie na podstawie ilości wiadomości w kolejkach
• Wykorzystamy metryki prometheus do skalowania i alarmów
• Zrobimy piękne wykresy żeby zadowolić szefa, który nie
chce grzebać w trzewiach
• Stworzymy CustomMetrics dla k8s
• Użyjemy k8s Horizontal Pod Autoscaler
• Napotkamy pierwsze problemy
17. Read replicas w MySQL
• Kuszące, ale może przynieść nam sporo zmartwień
(kosztów)
• mySQL-exporter dostarcza wielu ciekawych metryk
• Uruchamiając aplikację firm trzecich nie ma gwarancji jak
one zadziałają w przypadku rozsynchronizowania
21. Chceta mięsa
mySQL
Master
mySQL
read
replica
Zajefajne zadanie w cronie
odpalane co minutę
API
REST
select * from order_status where
transaction_date_changed >
date_sub(now(), interval 3 minute) Update order_status set
transaction_date_changed=now()
where id=1
Update order_status set
Status=1 where id=blabla
23. Update
cost =100
data = „SELECT balance from account where id=1” (dane z repliki)
newBalance = data - cost
„UPDATE account set balance=newBalance where id=1” (dane na mastera)
Kontra
„UPDATE account set balance=balance-cost where id=1” (dane na mastera)
24. Dostarczenie danych do prometheus
na przykładzie giełd crypto
• spora ilość ogólnodostępnych exporterów do
popularnych rozwiązań
• łatwa integracja w kodzie np (prometheus-client,
opencensus)
• Możliwość dostarczenia metryk na podstawie
np zewnętrzych danych
27. Nie samym k8s człowiek żyje
• Telegraf uniwersalne narzędzie do zbierania i exportu
metryk - https://github.com/influxdata/telegraf
• Wiele formatów inputs oraz outputs
• Zbierzemy dane o rozmowach telefonicznych
28. Telegraf config
[global_tags]
team = "uszanowanko"
[[outputs.prometheus_client]]
listen = ":9273"
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
[[inputs.snmp]]
agents = [ "127.0.0.1:161" ]
version = 2
community = "public"
name = "snmp"
[[inputs.snmp.field]]
name = "processed_calls"
oid = "ASTERISK-MIB::astConfigCallsProcessed.0"
30. Metrics
# HELP snmp_processed_calls Telegraf collected metric
# TYPE snmp_processed_calls untyped
snmp_processed_calls{agent_host="127.0.0.1",host="static",team="uszanowanko"} 2
# HELP docker_memory_total Telegraf collected metric
# TYPE docker_memory_total untyped
docker_memory_total{engine_host="static",host="static",server_version="0.0.0-201905
09050102-e9f60f21b0",team="uszanowanko"} 2.087882752e+09
# HELP docker_n_containers Telegraf collected metric
# TYPE docker_n_containers untyped
docker_n_containers{engine_host="static",host="static",server_version="0.0.0-201905
09050102-e9f60f21b0",team="uszanowanko"} 1
# HELP docker_n_containers_paused Telegraf collected metric
# TYPE docker_n_containers_paused untyped
docker_n_containers_paused{engine_host="static",host="static",server_version="0.0.0
-20190509050102-e9f60f21b0",team="uszanowanko"} 0
# HELP docker_n_containers_running Telegraf collected metric
# TYPE docker_n_containers_running untyped
docker_n_containers_running{engine_host="static",host="static",server_version="0.0.
0-20190509050102-e9f60f21b0",team="uszanowanko"} 0
# HELP docker_n_containers_stopped Telegraf collected metric
# TYPE docker_n_containers_stopped untyped
docker_n_containers_stopped{engine_host="static",host="static",server_version="0.0.
0-20190509050102-e9f60f21b0",team="uszanowanko"} 1
31.
32. Po co
• Predictive dialer
• Statystyki pracy agentów CC
• Uruchamianie różnego rodzaju aplikacji bazujących na
metrykach (kierowanie ruchu, zasilania kont u operatorów)
• Fraud detection
• Wysyłanie notyfikacji do niegrzecznych użytkowników
33. Biznes kocha słupki
• w szybki sposób dostarczamy biznesowi informacji
o ich procesach (stany magazynowe, sprzedaż)
• Biznes może sam definiować poziomy alertów i zarządzać
notyfikacjami
• Dashboards zbudowane pod każdy release czy też PR
• Nie obciążanie aplikacji głównej danymi statystycznymi
• Jak ja mam im sprzedać grafanę ? Rest API Promethues