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 code

      * http_request_duration_seconds, request duration histogram
      partitioned over HTTP method

      * http_request_size_bytes, request size histogram partitioned over
      HTTP method

      * http_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.

