BASH
#Формат метрик
metric_name{label1=<label1>, ..., labelN=<labelN>} metric_value
up{instance="localhost:8000", job="sample"} 1 #sample поднялся http_requests_total покажет вам только одно общее число запросов. Чтобы получить больше деталей и контекста, к метрикам добавляют метки — специальные дополнительные поля.method="GET" и status="200"), вы сможете узнать, сколько именно успешных GET-запросов было выполнено. Это делает метрики более гибкими и полезными для более детального анализа.ram_1_ip.instance и job. Когда Prometheus забирает данные, он ещё проставляет временную метку timestamp (UNIX).Сергей
BASH
version: "3"
services:
prometheus:
image: prom/prometheus
ports:
- target: 9090
published: 9090
volumes:
- type: bind
source: ./prometheus.yml
target: /etc/prometheus/prometheus.yml prometheus.yml.BASH
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
scrape_interval: 5s
static_configs:
- targets: ["localhost:9090"] scrape_configs определяет список сервисов для извлечения метрик. Вначале единственным источником метрик будет сервер Prometheus.BASH
docker-compose up -d http://localhost:9090/metrics можно получить список метрик (пока только Prometheus):http://localhost:9090/targets?search=, то можно увидеть источник метрик:YAML
app:
image: sample-app
build:
context: app
dockerfile: ./Dockerfile
ports:
- target: 8000
published: 8080 scrape в prometheus.yml приложение.YAML
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
scrape_interval: 5s
static_configs:
- targets: ["localhost:9090"]
- job_name: "app"
scrape_interval: 10s
static_configs:
- targets: ["app:8000"]
YAML
docker-compose down
docker-compose up -d http://locahost:8080/metrics можно получить метрики:http://localhost:9090/targets?search= вы увидите новый сервис app:Сергей
Полный код app.py
PYTHON
import random
import time
from flask import Flask, request
from prometheus_client import Histogram, make_wsgi_app
from werkzeug import Response
from werkzeug.middleware.dispatcher import DispatcherMiddleware
app = Flask(__name__)
app.wsgi_app = DispatcherMiddleware(
app.wsgi_app, {"/metrics": make_wsgi_app()}
)
HTTP_REQUEST_DURATION = Histogram(
"http_request_duration",
"Requests durations",
["method", "url", "code"],
buckets=[0.01, 0.1, 0.5, 2, float("inf")],
)
def observe_http(func):
def wrapper(*args, **kwargs):
start = time.time()
response = func(*args, **kwargs)
end = time.time()
HTTP_REQUEST_DURATION.labels(
method=request.method,
code=response.status_code,
url=request.url,
).observe(end - start)
return response
return wrapper
@app.route("/")
@app.route("/health")
def check_health():
return "I am still alive!"
@app.route("/rand_metrics")
@observe_http
def random_metric():
random_duration = random.randint(1, 50) * 0.001
time.sleep(random_duration) #задержка
response_code = random.choice([200, 200, 200, 200, 200, 400, 401, 500]) #коды ответа
return Response(str(response_code), status=response_code) method, code, url (that metric can be grouped by)PYTHON
docker-compose build
docker-compose up -d http://localhost:8080/rand_metrics раз десять и убедитесь, что метрики есть:YAML
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
volumes:
- grafana_data:/var/lib/grafana BASH
docker-compose up -d http://prometheus:9090. Сохраните (кнопка внизу).http_request_duration_count и нажмите Run queries. Нарисуется график, дальше исправьте Title в Panel Options и нажмите Save.http_request_duration_count и label = 500 (ошибочные запросы) и нажмите Run queries. Нарисуется график, дальше исправьте Title в Panel Options и нажмите Save.
Проделайте то же и с Durations.http_request_duration_bucket, в функциях агрегации выберите Avg by (средняя) по метке le (время меньше, чем из наших синтетических метрик) и нажмите Run queries.
Нарисуется график, дальше исправьте Title в Panel Options и нажмите Save. По итогу у вас получится вот такой вариант RED.