Ответ
Чтобы Prometheus мог собирать метрики, приложение должно предоставлять эндпоинт (обычно /metrics) с данными в текстовом формате Prometheus. Есть несколько основных подходов:
1. Инструментирование кода приложения (Instrumentation): Используйте клиентские библиотеки Prometheus для вашего стека. Они создают и обновляют метрики в памяти приложения.
Пример для Go-приложения:
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
requestsTotal = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests.",
},
)
)
func init() {
prometheus.MustRegister(requestsTotal)
}
func main() {
http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
requestsTotal.Inc()
w.Write([]byte("Hello"))
})
http.ListenAndServe(":8080", nil)
}
2. Использование экспортеров (Exporters):
Для сторонних систем (базы данных, веб-серверы, оборудование), код которых нельзя изменить, используются экспортеры. Например, node_exporter для системных метрик сервера.
3. Pushgateway для кратковременных задач: Для задач типа cron-job или batch-процессов, которые живут недолго, метрики можно отправлять в Pushgateway, откуда их уже заберет Prometheus.
echo "my_metric 3.14" | curl --data-binary @- http://pushgateway:9091/metrics/job/my_job
4. Конфигурация Prometheus:
В prometheus.yml нужно добавить scrape_configs для обнаружения целей (targets) вашего приложения.
scrape_configs:
- job_name: 'my-app'
static_configs:
- targets: ['app-host:8080']
metrics_path: '/metrics'
Ключевые практики:
- Используйте осмысленные имена метрик (латинские буквы, нижние подчеркивания).
- Добавляйте labels для детализации (например,
path,method,status_codeдля HTTP-запросов). - Выносите порт метрик отдельно от основного API приложения.