I released a small project I wrote a while ago, to create quick Prometheus exporters in Perl for providing some custom data. The project itself can be found at https://github.com/insani4c/prometheus-exporter. Back then I decided not to use Net::Prometheus as I wanted to use HTTP::Daemon with threads and not Plack.
A small example of how to use the framework:
my $exporter = Prometheus::Exporter->new({ listen_port => 9090, listen_addr => "127.0.0.1", max_threads => 5, }); $exporter->register_metrics({ test_metric => {type => "gauge", desc => "A test metric"}, test_metric_labels => {type => "gauge", desc => "A test metric", labels => ["code=42", "code=99"]}, test_counter => {type => "counter", desc => "A test metric"}, test_histogram => {type => "histogram", buckets => ['0.3', '0.6', '1.2', '+Inf']}, }); $exporter->register_collector(sub { my $timeout = int(rand(5)); sleep $timeout; $exporter->get_metric("test_metric")->value(rand(100)); $exporter->get_metric("test_metric_labels")->value([rand(42), rand(99)]); $test_counter += int(rand(20)); $exporter->get_metric("test_counter")->value($test_counter); $histo_buckets{"0.3"} += rand(20); $histo_buckets{"0.6"} += $histo_buckets{"0.3"} + rand(20); $histo_buckets{"1.2"} += $histo_buckets{"0.6"} + rand(20); $histo_buckets{"+Inf"} += $histo_buckets{"1.2"} + rand(20); my $histo_sum = 2.0 * $histo_buckets{"+Inf"}; my $histo_count = $histo_buckets{"+Inf"}; $exporter->get_metric("test_histogram")->value(\%histo_buckets, $histo_sum, $histo_count); }); $exporter->run;
The framework will start a small HTTP daemon once run()
is called and will handle all client requests by using threads
. On each request, the framework will call the subroutine
or coderef
defined at register_collector()
. Currently, that coderef must store the observed values by using the construct seen in the above example, by calling the value()
method on the registered metric objects.
Also currently, the histogram implementation is not yet supporting labels.