SlideShare a Scribd company logo
1 of 35
Download to read offline
Monitorowanie systemu
dlaczego mój kardiolog
jest bogatym człowiekiem
Wojciech Wójcik
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
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ń
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
grafana:

adminPassword: uszanowankoHura

extraEmptyDirMounts:

- name: provisioning-notifiers

mountPath: /etc/grafana/provisioning/notifiers

additionalDataSources:

- name: Mysql-Uszanowanko

type: mysql

url: "uszanowanko-mysql.db:3306"

user: kurnik

password: Ciapcie

database: uszanowanko

isDefault: false

notifiers:

notifiers.yaml:

notifiers:

- name: prometheus-alertmanager-notifier

type: prometheus-alertmanager

uid: prometheus-alertmanager1

org_id: 1

is_default: true

settings:

url: http://prometheus-operator-alertmanager:9093

sidecar:

dashboards:

searchNamespace: ALL

datasources:

searchNamespace: ALL
alertmanager:

config:

global:

resolve_timeout: 5m

route:

group_by: ['job']

group_wait: 30s

group_interval: 5m

repeat_interval: 12h

receiver: 'null'

routes:

- match:

alertname: Watchdog

receiver: 'null'

- match:

alertname: MessagesWaitingInQueues

receiver: 'slack_general'

- match:

alertname: BTCBuyPrice

receiver: 'slack_general'

- match:

alertname: BTCSellPrice

receiver: 'slack_general'

receivers:

- name: 'null'

- name: slack_general

slack_configs:

- api_url: https://hooks.slack.com/services/fff/ffff/blbbb

channel: '#uszanowanko'

icon_url: https://avatars3.githubusercontent.com/u/3380462

send_resolved: true

title: '{{ template "custom_title" . }}'

text: '{{ template "custom_slack_message" . }}'

templates:

- '/etc/alertmanager/config/notifications_slack.tmpl'
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 }}
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
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
Zainstalowany RabbitMQ (https://github.com/helm/charts/tree/master/stable/rabbitmq)

Config:

metrics:

enabled: true

Skonfigurowany ServiceMonitor
apiVersion: monitoring.coreos.com/v1

kind: ServiceMonitor

metadata:

name: rabbitmq-exporter

namespace: rabbitmq

labels:

release: prometheus-operator

spec:

selector:

matchLabels:

app: rabbitmq

endpoints:

- port: metrics
Aplikacja
• Wysyła dużo zadań do kolejki, ale ich przetwarzanie trwa
długo (np łączymy się do wolnego api)
Własne metryki
apiVersion: monitoring.coreos.com/v1

kind: PrometheusRule

metadata:

labels:

app: prometheus-operator

release: prometheus-operator

name: rabbit-queue-rule

spec:

groups:

- name: rabbit.rules

rules:

- record: messages_waiting_per_consumer

expr: avg(avg_over_time(rabbitmq_queue_messages_ready{queue="uszanowanko"}[5m]) /
avg_over_time(rabbitmq_queue_consumers{queue="uszanowanko"}[5m]))

labels:

namespace: default

service: uszanowanko-queue

- alert: MessagesWaitingInQueues

annotations:

message: Czas oczekiwania wiadomosci w kolejce {{ $labels.service }} w namespace
{{ $labels.namespace }} wynosi {{ $value }}

expr: messages_waiting_per_consumer > 2

for: 5m

labels:

severity: info
• Jak dostarczyć dane dla k8s horizonal pod autoscaler

• Prometheus-adapter https://github.com/helm/charts/tree/master/
stable/prometheus-adapter

Config

prometheus:

url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local

port: 9090

rules:

default: false

custom:

- seriesQuery: messages_waiting_per_consumer{namespace!='',service!=''}

resources:

overrides:

namespace: {resource: 'namespace'}

service: {resource: 'service'}

name:

matches: ^(.*)

as: ${1}

metricsQuery: <<.Series>>{<<.LabelMatchers>>}
apiVersion: autoscaling/v2beta1

kind: HorizontalPodAutoscaler

metadata:

name: uszanowanko-queue-autoscaler

spec:

scaleTargetRef:

apiVersion: apps/v1

kind: Deployment

name: rabbitmq-consumer-example

minReplicas: 1

maxReplicas: 20

metrics:

- type: Object

object:

target:

kind: Service

name: uszanowanko-queue

metricName: messages_waiting_per_consumer

targetValue: 1
HPA
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
Idealny świat
Update value: 16
Select result: 16
Update value: 23
Select result: 23
Update value: 31
Select result: 31
Update value: 12
Select result: 12
Update value: 33
Select result: 33
Polecenie zmieniające
świat
STOP SLAVE SQL_THREAD;

CHANGE MASTER TO MASTER_DELAY = 40;
START SLAVE SQL_THREAD;
Ooooo
Select result: 33
Update value: 6
Select result: 33
Update value: 8
Select result: 33
Update value: 13
Select result: 33
Update value: 43
Select result: 33
Update value: 30
Select result: 33
Update value: 47
Select result: 33
Update value: 45
Select result: 33
Update value: 5
Select result: 33
Update value: 38
Select result: 33
Update value: 4
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
Doładowania pre-paid
mySQL
master
mySQL
read
replica
API
REST
select used from accounts where
voucher=132323232
If !used {
update accounts set
balance = (balance+500) , used = true
where voucher=132323232
}
Wiele zapytań z grubymi selectami
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)
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
apiVersion: monitoring.coreos.com/v1

kind: PrometheusRule

metadata:

labels:

app: prometheus-operator

release: prometheus-operator

name: prometheus-exchanges-rules

namespace: monitoring

spec:

groups:

- name: btc.rules

rules:

- alert: BTCBuyPrice

annotations:

message: 'Cena zakupu {{ $labels.pair }} na {{ $labels.exchange }} wynosi {{ $value }}'

expr: 'exchange_trades{type="ask", quantile="0.99"} > 5001'

for: 3m

labels:

severity: info

- alert: BTCSellPrice

annotations:

message: 'Cena sprzedazy {{ $labels.pair }} na {{ $labels.exchange }} wynosi {{ $value }}'

expr: 'exchange_trades{type="bid", quantile="0.99"} < 6001'

for: 3m

labels:

severity: info
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
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"
Promethues config
- job_name: 'telegraf'

scrape_interval: 5s

static_configs:

- targets: [’1.1.1.1:9273’]
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
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
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
A teraz czas na pytania.
Proszę go dojechać
Dzięki.
FIN

More Related Content

What's hot

ETW w służbie programisty .NET
ETW w służbie programisty .NETETW w służbie programisty .NET
ETW w służbie programisty .NETKonrad Kokosa
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychMarcin Jasiński
 
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegroallegro.tech
 
Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Maciek Próchniak
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegroallegro.tech
 
Python szybki start
Python   szybki startPython   szybki start
Python szybki startSages
 
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...PROIDEA
 
ETW w służbie programisty .NET
ETW w służbie programisty .NETETW w służbie programisty .NET
ETW w służbie programisty .NETKonrad Kokosa
 
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
Paweł Kucharski: Oswajamy Słonia czyli po co nam HadoopPaweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
Paweł Kucharski: Oswajamy Słonia czyli po co nam HadoopAnalyticsConf
 

What's hot (9)

ETW w służbie programisty .NET
ETW w służbie programisty .NETETW w służbie programisty .NET
ETW w służbie programisty .NET
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegro
 
Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 
Python szybki start
Python   szybki startPython   szybki start
Python szybki start
 
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
 
ETW w służbie programisty .NET
ETW w służbie programisty .NETETW w służbie programisty .NET
ETW w służbie programisty .NET
 
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
Paweł Kucharski: Oswajamy Słonia czyli po co nam HadoopPaweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
 

Similar to Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?

Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPROIDEA
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaMaciej Ziarko
 
Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.
Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.
Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.Semihalf
 
TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...
TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...
TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...Trójmiejska Grupa Testerska
 
Silesia JUG : Java Message Service
Silesia JUG : Java Message ServiceSilesia JUG : Java Message Service
Silesia JUG : Java Message Servicemarekgoldmann
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaLeszek Mi?
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PROIDEA
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwLuke Adamczewski
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Polcode
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.Semihalf
 
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z CapistranoMichał Szajbe
 
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychGanymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychSKN Shader
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?javOnet
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Laravel Poland MeetUp
 

Similar to Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem? (20)

Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Torquebox
TorqueboxTorquebox
Torquebox
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarkaThymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
Thymeleaf - szablony, które bez przetworzenia zrozumie twoja przeglądarka
 
Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.
Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.
Masz wiadomość! Komunikacja wieloprocesorowa w praktyce.
 
TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...
TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...
TGT#11 - Zostały Ci jeszcze jakieś włosy? (Testowanie programów równoległych)...
 
Silesia JUG : Java Message Service
Silesia JUG : Java Message ServiceSilesia JUG : Java Message Service
Silesia JUG : Java Message Service
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
Benchmarking
Benchmarking Benchmarking
Benchmarking
 
Deployment kodu z Capistrano
Deployment kodu z CapistranoDeployment kodu z Capistrano
Deployment kodu z Capistrano
 
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychGanymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)
 

More from The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeThe Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSThe Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 

More from The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?

  • 1. Monitorowanie systemu dlaczego mój kardiolog jest bogatym człowiekiem Wojciech Wójcik
  • 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
  • 5. grafana: adminPassword: uszanowankoHura extraEmptyDirMounts: - name: provisioning-notifiers mountPath: /etc/grafana/provisioning/notifiers additionalDataSources: - name: Mysql-Uszanowanko type: mysql url: "uszanowanko-mysql.db:3306" user: kurnik password: Ciapcie database: uszanowanko isDefault: false notifiers: notifiers.yaml: notifiers: - name: prometheus-alertmanager-notifier type: prometheus-alertmanager uid: prometheus-alertmanager1 org_id: 1 is_default: true settings: url: http://prometheus-operator-alertmanager:9093 sidecar: dashboards: searchNamespace: ALL datasources: searchNamespace: ALL
  • 6. alertmanager: config: global: resolve_timeout: 5m route: group_by: ['job'] group_wait: 30s group_interval: 5m repeat_interval: 12h receiver: 'null' routes: - match: alertname: Watchdog receiver: 'null' - match: alertname: MessagesWaitingInQueues receiver: 'slack_general' - match: alertname: BTCBuyPrice receiver: 'slack_general' - match: alertname: BTCSellPrice receiver: 'slack_general' receivers: - name: 'null' - name: slack_general slack_configs: - api_url: https://hooks.slack.com/services/fff/ffff/blbbb channel: '#uszanowanko' icon_url: https://avatars3.githubusercontent.com/u/3380462 send_resolved: true title: '{{ template "custom_title" . }}' text: '{{ template "custom_slack_message" . }}' templates: - '/etc/alertmanager/config/notifications_slack.tmpl'
  • 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
  • 11. Zainstalowany RabbitMQ (https://github.com/helm/charts/tree/master/stable/rabbitmq)
 Config: metrics: enabled: true Skonfigurowany ServiceMonitor apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: rabbitmq-exporter namespace: rabbitmq labels: release: prometheus-operator spec: selector: matchLabels: app: rabbitmq endpoints: - port: metrics
  • 12. Aplikacja • Wysyła dużo zadań do kolejki, ale ich przetwarzanie trwa długo (np łączymy się do wolnego api)
  • 13. Własne metryki apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: app: prometheus-operator release: prometheus-operator name: rabbit-queue-rule spec: groups: - name: rabbit.rules rules: - record: messages_waiting_per_consumer expr: avg(avg_over_time(rabbitmq_queue_messages_ready{queue="uszanowanko"}[5m]) / avg_over_time(rabbitmq_queue_consumers{queue="uszanowanko"}[5m])) labels: namespace: default service: uszanowanko-queue - alert: MessagesWaitingInQueues annotations: message: Czas oczekiwania wiadomosci w kolejce {{ $labels.service }} w namespace {{ $labels.namespace }} wynosi {{ $value }} expr: messages_waiting_per_consumer > 2 for: 5m labels: severity: info
  • 14. • Jak dostarczyć dane dla k8s horizonal pod autoscaler • Prometheus-adapter https://github.com/helm/charts/tree/master/ stable/prometheus-adapter Config prometheus: url: http://prometheus-operator-prometheus.monitoring.svc.cluster.local port: 9090 rules: default: false custom: - seriesQuery: messages_waiting_per_consumer{namespace!='',service!=''} resources: overrides: namespace: {resource: 'namespace'} service: {resource: 'service'} name: matches: ^(.*) as: ${1} metricsQuery: <<.Series>>{<<.LabelMatchers>>}
  • 15. apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: uszanowanko-queue-autoscaler spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: rabbitmq-consumer-example minReplicas: 1 maxReplicas: 20 metrics: - type: Object object: target: kind: Service name: uszanowanko-queue metricName: messages_waiting_per_consumer targetValue: 1 HPA
  • 16.
  • 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
  • 18. Idealny świat Update value: 16 Select result: 16 Update value: 23 Select result: 23 Update value: 31 Select result: 31 Update value: 12 Select result: 12 Update value: 33 Select result: 33
  • 19. Polecenie zmieniające świat STOP SLAVE SQL_THREAD; CHANGE MASTER TO MASTER_DELAY = 40; START SLAVE SQL_THREAD;
  • 20. Ooooo Select result: 33 Update value: 6 Select result: 33 Update value: 8 Select result: 33 Update value: 13 Select result: 33 Update value: 43 Select result: 33 Update value: 30 Select result: 33 Update value: 47 Select result: 33 Update value: 45 Select result: 33 Update value: 5 Select result: 33 Update value: 38 Select result: 33 Update value: 4
  • 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
  • 22. Doładowania pre-paid mySQL master mySQL read replica API REST select used from accounts where voucher=132323232 If !used { update accounts set balance = (balance+500) , used = true where voucher=132323232 } Wiele zapytań z grubymi selectami
  • 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
  • 25. apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: app: prometheus-operator release: prometheus-operator name: prometheus-exchanges-rules namespace: monitoring spec: groups: - name: btc.rules rules: - alert: BTCBuyPrice annotations: message: 'Cena zakupu {{ $labels.pair }} na {{ $labels.exchange }} wynosi {{ $value }}' expr: 'exchange_trades{type="ask", quantile="0.99"} > 5001' for: 3m labels: severity: info - alert: BTCSellPrice annotations: message: 'Cena sprzedazy {{ $labels.pair }} na {{ $labels.exchange }} wynosi {{ $value }}' expr: 'exchange_trades{type="bid", quantile="0.99"} < 6001' for: 3m labels: severity: info
  • 26.
  • 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"
  • 29. Promethues config - job_name: 'telegraf' scrape_interval: 5s static_configs: - targets: [’1.1.1.1:9273’]
  • 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
  • 34. A teraz czas na pytania. Proszę go dojechać