Integracja zbierania metryk i monitorowania
Implementuj zbieranie metryk i integruj aplikację z zewnętrznymi systemami monitorowania, takimi jak Prometheus i Grafana, aby zapewnić obserwowalność systemu.
Integracja zbierania metryk i monitorowania to bezpłatna lekcja Erlang OTP: Distributed & Fault-Tolerant Systems Programming na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Erlang OTP: Distributed & Fault-Tolerant Systems Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Erlang OTP: Distributed & Fault-Tolerant Systems Programming zawiera 4 lekcji w sumie.
Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.
Observability with Metrics
Welcome to Metrics & Monitoring Integration! In modern systems, understanding what's happening inside your application is crucial. This is called observability.
Observability relies on three pillars:
- Logs: Records of discrete events.
- Traces: End-to-end request flows across services.
- Metrics: Aggregated numerical data points over time.
This lesson focuses on metrics, which give you a high-level view of system health and performance trends.
Why Metrics Matter
Metrics are numerical measurements collected at regular intervals. They help you answer questions like:
- How many requests per second is my service handling?
- What's the average response time?
- How much memory is my Erlang VM using?
- Are there any errors occurring?
By tracking these over time, you can spot trends, identify bottlenecks, and react to issues proactively.
Types of Metrics
There are several common types of metrics:
- Counters: A single value that only ever goes up (e.g., total requests, errors).
- Gauges: A single value that can go up or down (e.g., current active users, CPU usage).
- Histograms: Sample observations (like request durations) and count them in configurable buckets, often providing sum and count.
- Summaries: Similar to histograms but calculate configurable quantiles (e.g., 99th percentile latency) on the client side.
Erlang's Built-in Statistics
Erlang provides some basic system statistics out of the box through the erlang:statistics/1 function. These are useful for fundamental VM health checks.
You can get data like:
scheduler_wall_time: CPU time spent by schedulers.io: Total I/O operations.memory: Memory usage details.
While useful, these often aren't enough for application-specific insights. We need custom metrics.
Custom Metric Collection
For application-specific metrics, you'll often create your own. A common pattern is to use a gen_server process to manage and update metric values, ensuring atomic updates.
Try running this example of a simple counter managed by a gen_server:
-module(main).
-export([main/0]).
% --- simple_counter.erl (simplified for single file demo) ---
% A simple GenServer to maintain a counter
-behaviour(gen_server).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
% GenServer callbacks
init([]) -> {ok, 0}.
handle_call(get_value, _From, State) -> {reply, State, State}.
handle_cast(increment, State) -> {noreply, State + 1}.
handle_cast(stop, _State) -> {stop, normal, ok}.
handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.
% Client API for our counter
start_counter() -> gen_server:start({local, my_counter}, ?MODULE, [], []).
increment_counter() -> gen_server:cast(my_counter, increment).
get_counter_value() -> gen_server:call(my_counter, get_value).
stop_counter() -> gen_server:cast(my_counter, stop).
% --- End simple_counter.erl ---
main() ->
io:format("Starting a simple counter process...~n"),
{ok, _Pid} = start_counter(),
io:format("Initial counter value: ~p~n", [get_counter_value()]),
increment_counter(),
io:format("After 1 increment: ~p~n", [get_counter_value()]),
increment_counter(),
increment_counter(),
io:format("After 3 increments: ~p~n", [get_counter_value()]),
stop_counter(),
io:format("Counter process stopped.~n").The Telemetry Library
For more advanced and standardized metric collection in Erlang/Elixir, the Telemetry library is widely used. It provides a common way to emit events from your application.
Instead of manually updating a counter, you can:
- Define telemetry events (e.g.,
[:my_app, :request, :start],[:my_app, :request, :stop]). - Attach handlers to these events to process and aggregate metrics.
This decouples event emission from metric collection, making your system more flexible.
Exposing Metrics
Once you collect metrics, you need to make them available to external monitoring systems. This usually involves an exporter.
An exporter is a component (often an HTTP server) that:
- Gathers current metric values from your application.
- Formats them into a standard format (e.g., Prometheus text format).
- Serves them via an HTTP endpoint (e.g.,
/metrics).
Monitoring systems then 'scrape' this endpoint to collect the data.
Prometheus: A Pull-Based System
Prometheus is a popular open-source monitoring system. It works on a pull model: instead of your application pushing metrics, Prometheus regularly 'scrapes' (pulls) metrics from configured targets (your application's exporter endpoints).
It then stores these metrics as time-series data, allowing you to query and analyze trends over time. Prometheus is excellent for operational monitoring and alerting.
Prometheus Text Format
Erlang applications integrate with Prometheus by exposing an HTTP endpoint that serves metrics in the Prometheus text exposition format. This is a simple, human-readable format.
Here's an example of what Prometheus expects to scrape:
# HELP my_app_requests_total Total number of requests processed.
# TYPE my_app_requests_total counter
my_app_requests_total 1234
# HELP my_app_active_users Current number of active users.
# TYPE my_app_active_users gauge
my_app_active_users 50
# HELP my_app_request_duration_seconds Request duration in seconds.
# TYPE my_app_request_duration_seconds histogram
my_app_request_duration_seconds_bucket{le="0.1"} 100
my_app_request_duration_seconds_bucket{le="0.5"} 250
my_app_request_duration_seconds_bucket{le="1.0"} 350
my_app_request_duration_seconds_bucket{le="+Inf"} 400
my_app_request_duration_seconds_sum 150.0
my_app_request_duration_seconds_count 400Grafana for Visualization
While Prometheus stores and queries metrics, Grafana is the go-to tool for visualizing them. Grafana connects to various data sources (like Prometheus) and allows you to build interactive dashboards.
With Grafana, you can:
- Create graphs, charts, and tables.
- Combine data from multiple metrics.
- Set up alerts based on visual thresholds.
- Share dashboards with your team.
Monitoring Integration Check
You've learned about collecting and exposing metrics, and how Prometheus and Grafana work together. Let's test your understanding!
Recap & Next Steps
Great job! You've covered the essentials of metrics and monitoring integration:
- The importance of observability and the role of metrics.
- How to collect custom metrics in Erlang, including using
gen_serverprocesses. - The concept of exporters and the Prometheus text format.
- How Prometheus acts as a pull-based time-series database.
- How Grafana provides powerful visualization for your metrics.
With these tools, you can gain deep insights into your Erlang applications!
Często zadawane pytania
Czy lekcja „Integracja zbierania metryk i monitorowania” jest bezpłatna?
Tak — pełny tekst „Integracja zbierania metryk i monitorowania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Erlang OTP: Distributed & Fault-Tolerant Systems Programming, przejdź na CoddyKit PRO. Kurs Erlang OTP: Distributed & Fault-Tolerant Systems Programming zawiera 4 lekcji w sumie.
Co nauczysz się w „Integracja zbierania metryk i monitorowania”?
Implementuj zbieranie metryk i integruj aplikację z zewnętrznymi systemami monitorowania, takimi jak Prometheus i Grafana, aby zapewnić obserwowalność systemu. Ćwiczysz Erlang OTP: Distributed & Fault-Tolerant Systems Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Erlang OTP: Distributed & Fault-Tolerant Systems Programming?
Nie wymagamy żadnego doświadczenia. Erlang OTP: Distributed & Fault-Tolerant Systems Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Integracja zbierania metryk i monitorowania”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Erlang OTP: Distributed & Fault-Tolerant Systems Programming?
Tak. Każda lekcja Erlang OTP: Distributed & Fault-Tolerant Systems Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Techniki profilowania Erlanga
- Śledzenie i debugowanie systemów rozproszonych
- Integracja zbierania metryk i monitorowania
- Analiza pamięci i dostrajanie garbage collection