NAME
Mojolicious::Plugin::PrometheusTiny - Export metrics using Prometheus::Tiny::Shared
SYNOPSIS
# Mojolicious
$self->plugin('PrometheusTiny');
# Mojolicious::Lite
plugin 'PrometheusTiny';
# Mojolicious::Lite, with custom response buckets (seconds)
plugin 'PrometheusTiny' => { response_buckets => [qw/4 5 6/] };
# You can add your own route to do access control
my $under = app->routes->under('/secret' =>sub {
my $c = shift;
return 1 if $c->req->url->to_abs->userinfo eq 'Bender:rocks';
$c->res->headers->www_authenticate('Basic');
$c->render(text => 'Authentication required!', status => 401);
return undef;
});
plugin PrometheusTiny => {
route => $under,
# You may declare additional metrics with their own TYPE and HELP...
setup => sub($app, $p) {
$p->declare('mojo_random',
type => 'gauge',
help => "Custom prometheus gauge"
);
},
# ...and set up a callback to update them right before exporting them
update => sub($c, $p) {
$p->set(mojo_random => rand(100));
},
};
DESCRIPTION
Mojolicious::Plugin::PrometheusTiny is a Mojolicious plugin that exports Prometheus metrics from Mojolicious. It's based on Mojolicious::Plugin::Prometheus but uses Prometheus::Tiny::Shared instead of Net::Prometheus.
Default hooks are installed to measure requests response time and count requests by HTTP return code, with optional labeling of worker PID and HTTP method. It is easy to add custom metrics and update them right before the metrics are exported.
There is no support for namespaces, subsystems or any other fancy Net::Prometheus features.
CODE QUALITY NOTICE
This is BETA code =head1 HELPERS
prometheus
Create further instrumentation into your application by using this helper which gives access to the Prometheus::Tiny::Shared object. See Prometheus::Tiny for usage.
METHODS
Mojolicious::Plugin::PrometheusTiny inherits all methods from Mojolicious::Plugin and implements the following new ones.
register
$plugin->register($app, \%config);
Register plugin in Mojolicious application.
%config
can have:
route
Mojolicious::Routes::Route object to attach the metrics to, defaults to generating a new one for '/'.
Default: /
path
The path to mount the exporter.
Default: /metrics
prometheus
Override the Prometheus::Tiny::Shared object. The default is a new singleton instance of Prometheus::Tiny::Shared.
request_buckets
Override buckets for request sizes histogram.
Default:
[ 1, 10, 100, 1_000, 10_000, 50_000, 100_000, 500_000, 1_000_000 ]
response_buckets
Override buckets for response sizes histogram.
Default:
[ 1, 10, 100, 1_000, 10_000, 50_000, 100_000, 500_000, 1_000_000 ]
duration_buckets
Override buckets for request duration setup => sub($app, $p) { $p->declare('mojo_random', type => 'gauge', help => "Custom prometheus gauge" ); }histogram.
Default:
[1..10, 20, 30, 60, 120, 300, 600, 1_200, 3_600, 6_000, 12_000]
worker_label
Label metrics by worker PID, which might increase significantly the number of Prometheus time series.
Default: true
method_label
Label metrics by HTTP method, which might increase significantly the number of Prometheus time series.
Default: true
setup
Coderef to be executed during setup. Receives as arguments Application and Prometheus instances. Can be used to declare and/or initialize new metrics. Though it is trivial to use $app->prometheus to declare metrics after plugin setup, code is more readable and easier to maintain when actions are listed in their natural order.
update
Coderef to be executed right before invoking exporter action configured in
path
. Receives as arguments Controller and Prometheus instances.
METRICS
This plugin exposes
http_requests_total
, request counter partitioned over HTTP method and HTTP response codehttp_request_duration_seconds
, request duration histogram partitioned over HTTP methodhttp_request_size_bytes
, request size histogram partitioned over HTTP methodhttp_response_size_bytes
, response size histogram partitioned over HTTP method
TO DO
Add optional Net::Prometheus::ProcessCollector-like process metrics.
AUTHOR
Javier Arturo Rodriguez
A significant part of this code has been ripped off Mojolicious::Plugin::Prometheus written by Vidar Tyldum
COPYRIGHT AND LICENSE
Copyright (c) 2023 by Javier Arturo Rodriguez.
This program is free software, you can redistribute it and/or modify it under the terms of the Artistic License version 2.0.
SEE ALSO
Mojolicious, Mojolicious::Guides, https://mojolicious.org, Mojolicious::Plugin::Prometheus, Prometheus::Tiny, Prometheus::Tiny::Shared.