prometheus-fastapi-instrumentator


Nameprometheus-fastapi-instrumentator JSON
Version 7.0.0 PyPI version JSON
download
home_pagehttps://github.com/trallnag/prometheus-fastapi-instrumentator
SummaryInstrument your FastAPI with Prometheus metrics.
upload_time2024-03-13 16:25:08
maintainer
docs_urlNone
authorTim Schwenke
requires_python>=3.8.1,<4.0.0
licenseISC
keywords prometheus instrumentation fastapi exporter metrics
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Prometheus FastAPI Instrumentator <!-- omit in toc -->

[![pypi-version](https://badge.fury.io/py/prometheus-fastapi-instrumentator.svg)](https://pypi.python.org/pypi/prometheus-fastapi-instrumentator)
[![python-versions](https://img.shields.io/pypi/pyversions/prometheus-fastapi-instrumentator.svg)](https://pypi.python.org/pypi/prometheus-fastapi-instrumentator)
[![downloads](https://pepy.tech/badge/prometheus-fastapi-instrumentator/month)](https://pepy.tech/project/prometheus-fastapi-instrumentator/month)
[![build](https://img.shields.io/github/actions/workflow/status/trallnag/kubestatus2cloudwatch/ci.yaml?branch=master)](https://github.com/trallnag/kubestatus2cloudwatch/actions)
[![codecov](https://codecov.io/gh/trallnag/prometheus-fastapi-instrumentator/branch/master/graph/badge.svg)](https://codecov.io/gh/trallnag/prometheus-fastapi-instrumentator)

A configurable and modular Prometheus Instrumentator for your FastAPI. Install
`prometheus-fastapi-instrumentator` from
[PyPI](https://pypi.python.org/pypi/prometheus-fastapi-instrumentator/). Here is
the fast track to get started with a pre-configured instrumentator. Import the
instrumentator class:

```python
from prometheus_fastapi_instrumentator import Instrumentator
```

Instrument your app with default metrics and expose the metrics:

```python
Instrumentator().instrument(app).expose(app)
```

Depending on your code you might have to use the following instead:

```python
instrumentator = Instrumentator().instrument(app)

@app.on_event("startup")
async def _startup():
    instrumentator.expose(app)
```

With this, your FastAPI is instrumented and metrics are ready to be scraped. The
defaults give you:

- Counter `http_requests_total` with `handler`, `status` and `method`. Total
  number of requests.
- Summary `http_request_size_bytes` with `handler`. Added up total of the
  content lengths of all incoming requests.
- Summary `http_response_size_bytes` with `handler`. Added up total of the
  content lengths of all outgoing responses.
- Histogram `http_request_duration_seconds` with `handler` and `method`. Only a
  few buckets to keep cardinality low.
- Histogram `http_request_duration_highr_seconds` without any labels. Large
  number of buckets (>20).

In addition, following behavior is active:

- Status codes are grouped into `2xx`, `3xx` and so on.
- Requests without a matching template are grouped into the handler `none`.

If one of these presets does not suit your needs you can do one of multiple
things:

- Pick one of the already existing closures from
  [`metrics`](./src/prometheus_fastapi_instrumentator/metrics.py) and pass it to
  the instrumentator instance. See [here](#adding-metrics) how to do that.
- Create your own instrumentation function that you can pass to an
  instrumentator instance. See [here](#creating-new-metrics) to learn how more.
- Don't use this package at all and just use the source code as inspiration on
  how to instrument your FastAPI.

## Table of Contents <!-- omit in toc -->

<!--TOC-->

- [Disclaimer](#disclaimer)
- [Features](#features)
- [Advanced Usage](#advanced-usage)
  - [Creating the Instrumentator](#creating-the-instrumentator)
  - [Adding metrics](#adding-metrics)
  - [Creating new metrics](#creating-new-metrics)
  - [Perform instrumentation](#perform-instrumentation)
  - [Specify namespace and subsystem](#specify-namespace-and-subsystem)
  - [Exposing endpoint](#exposing-endpoint)
- [Contributing](#contributing)
- [Licensing](#licensing)

<!--TOC-->

## Disclaimer

Not made for generic Prometheus instrumentation in Python. Use the Prometheus
client library for that. This packages uses it as well.

All the generic middleware and instrumentation code comes with a cost in
performance that can become noticeable.

## Features

Beyond the fast track, this instrumentator is **highly configurable** and it is
very easy to customize and adapt to your specific use case. Here is a list of
some of these options you may opt-in to:

- Regex patterns to ignore certain routes.
- Completely ignore untemplated routes.
- Control instrumentation and exposition with an env var.
- Rounding of latencies to a certain decimal number.
- Renaming of labels and the metric.
- Metrics endpoint can compress data with gzip.
- Opt-in metric to monitor the number of requests in progress.

It also features a **modular approach to metrics** that should instrument all
FastAPI endpoints. You can either choose from a set of already existing metrics
or create your own. And every metric function by itself can be configured as
well.

## Advanced Usage

This chapter contains an example on the advanced usage of the Prometheus FastAPI
Instrumentator to showcase most of it's features.

### Creating the Instrumentator

We start by creating an instance of the Instrumentator. Notice the additional
`metrics` import. This will come in handy later.

```python
from prometheus_fastapi_instrumentator import Instrumentator, metrics

instrumentator = Instrumentator(
    should_group_status_codes=False,
    should_ignore_untemplated=True,
    should_respect_env_var=True,
    should_instrument_requests_inprogress=True,
    excluded_handlers=[".*admin.*", "/metrics"],
    env_var_name="ENABLE_METRICS",
    inprogress_name="inprogress",
    inprogress_labels=True,
)
```

Unlike in the fast track example, now the instrumentation and exposition will
only take place if the environment variable `ENABLE_METRICS` is `true` at
run-time. This can be helpful in larger deployments with multiple services
depending on the same base FastAPI.

### Adding metrics

Let's say we also want to instrument the size of requests and responses. For
this we use the `add()` method. This method does nothing more than taking a
function and adding it to a list. Then during run-time every time FastAPI
handles a request all functions in this list will be called while giving them a
single argument that stores useful information like the request and response
objects. If no `add()` at all is used, the default metric gets added in the
background. This is what happens in the fast track example.

All instrumentation functions are stored as closures in the `metrics` module.

Closures come in handy here because it allows us to configure the functions
within.

```python
instrumentator.add(metrics.latency(buckets=(1, 2, 3,)))
```

This simply adds the metric you also get in the fast track example with a
modified buckets argument. But we would also like to record the size of all
requests and responses.

```python
instrumentator.add(
    metrics.request_size(
        should_include_handler=True,
        should_include_method=False,
        should_include_status=True,
        metric_namespace="a",
        metric_subsystem="b",
    )
).add(
    metrics.response_size(
        should_include_handler=True,
        should_include_method=False,
        should_include_status=True,
        metric_namespace="namespace",
        metric_subsystem="subsystem",
    )
)
```

You can add as many metrics you like to the instrumentator.

### Creating new metrics

As already mentioned, it is possible to create custom functions to pass on to
`add()`. This is also how the default metrics are implemented.

The basic idea is that the instrumentator creates an `info` object that contains
everything necessary for instrumentation based on the configuration of the
instrumentator. This includes the raw request and response objects but also the
modified handler, grouped status code and duration. Next, all registered
instrumentation functions are called. They get `info` as their single argument.

Let's say we want to count the number of times a certain language has been
requested.

```python
from typing import Callable
from prometheus_fastapi_instrumentator.metrics import Info
from prometheus_client import Counter

def http_requested_languages_total() -> Callable[[Info], None]:
    METRIC = Counter(
        "http_requested_languages_total",
        "Number of times a certain language has been requested.",
        labelnames=("langs",)
    )

    def instrumentation(info: Info) -> None:
        langs = set()
        lang_str = info.request.headers["Accept-Language"]
        for element in lang_str.split(","):
            element = element.split(";")[0].strip().lower()
            langs.add(element)
        for language in langs:
            METRIC.labels(language).inc()

    return instrumentation
```

The function `http_requested_languages_total` is used for persistent elements
that are stored between all instrumentation executions (for example the metric
instance itself). Next comes the closure. This function must adhere to the shown
interface. It will always get an `Info` object that contains the request,
response and a few other modified informations. For example the (grouped) status
code or the handler. Finally, the closure is returned.

**Important:** The response object inside `info` can either be the response
object or `None`. In addition, errors thrown in the handler are not caught by
the instrumentator. I recommend to check the documentation and/or the source
code before creating your own metrics.

To use it, we hand over the closure to the instrumentator object.

```python
instrumentator.add(http_requested_languages_total())
```

### Perform instrumentation

Up to this point, the FastAPI has not been touched at all. Everything has been
stored in the `instrumentator` only. To actually register the instrumentation
with FastAPI, the `instrument()` method has to be called.

```python
instrumentator.instrument(app)
```

Notice that this will do nothing if `should_respect_env_var` has been set during
construction of the instrumentator object and the respective env var is not
found.

### Specify namespace and subsystem

You can specify the namespace and subsystem of the metrics by passing them in
the instrument method.

```python
from prometheus_fastapi_instrumentator import Instrumentator

@app.on_event("startup")
async def startup():
    Instrumentator().instrument(app, metric_namespace='myproject', metric_subsystem='myservice').expose(app)
```

Then your metrics will contain the namespace and subsystem in the metric name.

```sh
# TYPE myproject_myservice_http_request_duration_highr_seconds histogram
myproject_myservice_http_request_duration_highr_seconds_bucket{le="0.01"} 0.0
```

### Exposing endpoint

To expose an endpoint for the metrics either follow
[Prometheus Python Client](https://github.com/prometheus/client_python) and add
the endpoint manually to the FastAPI or serve it on a separate server. You can
also use the included `expose` method. It will add an endpoint to the given
FastAPI. With `should_gzip` you can instruct the endpoint to compress the data
as long as the client accepts gzip encoding. Prometheus for example does by
default. Beware that network bandwith is often cheaper than CPU cycles.

```python
instrumentator.expose(app, include_in_schema=False, should_gzip=True)
```

Notice that this will to nothing if `should_respect_env_var` has been set during
construction of the instrumentator object and the respective env var is not
found.

## Contributing

Please refer to [`CONTRIBUTING.md`](CONTRIBUTING).

Consult [`DEVELOPMENT.md`](DEVELOPMENT.md) for guidance regarding development.

Read [`RELEASE.md`](RELEASE.md) for details about the release process.

## Licensing

The default license for this project is the
[ISC License](https://choosealicense.com/licenses/isc). A permissive license
functionally equivalent to the BSD 2-Clause and MIT licenses, removing some
language that is no longer necessary. See [`LICENSE`](LICENSE) for the license
text.

The [BSD 3-Clause License](https://choosealicense.com/licenses/bsd-3-clause) is
used as the license for the
[`routing`](src/prometheus_fastapi_instrumentator/routing.py) module. This is
due to it containing code from
[elastic/apm-agent-python](https://github.com/elastic/apm-agent-python). BSD
3-Clause is a permissive license similar to the BSD 2-Clause License, but with a
3rd clause that prohibits others from using the name of the copyright holder or
its contributors to promote derived products without written consent. The
license text is included in the module itself.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/trallnag/prometheus-fastapi-instrumentator",
    "name": "prometheus-fastapi-instrumentator",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8.1,<4.0.0",
    "maintainer_email": "",
    "keywords": "prometheus,instrumentation,fastapi,exporter,metrics",
    "author": "Tim Schwenke",
    "author_email": "tim@trallnag.com",
    "download_url": "https://files.pythonhosted.org/packages/0e/42/eeb55ea9b0eae7d6854bef6aef3ecd34674f85813bc3877efdaeb582ab7e/prometheus_fastapi_instrumentator-7.0.0.tar.gz",
    "platform": null,
    "description": "# Prometheus FastAPI Instrumentator <!-- omit in toc -->\n\n[![pypi-version](https://badge.fury.io/py/prometheus-fastapi-instrumentator.svg)](https://pypi.python.org/pypi/prometheus-fastapi-instrumentator)\n[![python-versions](https://img.shields.io/pypi/pyversions/prometheus-fastapi-instrumentator.svg)](https://pypi.python.org/pypi/prometheus-fastapi-instrumentator)\n[![downloads](https://pepy.tech/badge/prometheus-fastapi-instrumentator/month)](https://pepy.tech/project/prometheus-fastapi-instrumentator/month)\n[![build](https://img.shields.io/github/actions/workflow/status/trallnag/kubestatus2cloudwatch/ci.yaml?branch=master)](https://github.com/trallnag/kubestatus2cloudwatch/actions)\n[![codecov](https://codecov.io/gh/trallnag/prometheus-fastapi-instrumentator/branch/master/graph/badge.svg)](https://codecov.io/gh/trallnag/prometheus-fastapi-instrumentator)\n\nA configurable and modular Prometheus Instrumentator for your FastAPI. Install\n`prometheus-fastapi-instrumentator` from\n[PyPI](https://pypi.python.org/pypi/prometheus-fastapi-instrumentator/). Here is\nthe fast track to get started with a pre-configured instrumentator. Import the\ninstrumentator class:\n\n```python\nfrom prometheus_fastapi_instrumentator import Instrumentator\n```\n\nInstrument your app with default metrics and expose the metrics:\n\n```python\nInstrumentator().instrument(app).expose(app)\n```\n\nDepending on your code you might have to use the following instead:\n\n```python\ninstrumentator = Instrumentator().instrument(app)\n\n@app.on_event(\"startup\")\nasync def _startup():\n    instrumentator.expose(app)\n```\n\nWith this, your FastAPI is instrumented and metrics are ready to be scraped. The\ndefaults give you:\n\n- Counter `http_requests_total` with `handler`, `status` and `method`. Total\n  number of requests.\n- Summary `http_request_size_bytes` with `handler`. Added up total of the\n  content lengths of all incoming requests.\n- Summary `http_response_size_bytes` with `handler`. Added up total of the\n  content lengths of all outgoing responses.\n- Histogram `http_request_duration_seconds` with `handler` and `method`. Only a\n  few buckets to keep cardinality low.\n- Histogram `http_request_duration_highr_seconds` without any labels. Large\n  number of buckets (>20).\n\nIn addition, following behavior is active:\n\n- Status codes are grouped into `2xx`, `3xx` and so on.\n- Requests without a matching template are grouped into the handler `none`.\n\nIf one of these presets does not suit your needs you can do one of multiple\nthings:\n\n- Pick one of the already existing closures from\n  [`metrics`](./src/prometheus_fastapi_instrumentator/metrics.py) and pass it to\n  the instrumentator instance. See [here](#adding-metrics) how to do that.\n- Create your own instrumentation function that you can pass to an\n  instrumentator instance. See [here](#creating-new-metrics) to learn how more.\n- Don't use this package at all and just use the source code as inspiration on\n  how to instrument your FastAPI.\n\n## Table of Contents <!-- omit in toc -->\n\n<!--TOC-->\n\n- [Disclaimer](#disclaimer)\n- [Features](#features)\n- [Advanced Usage](#advanced-usage)\n  - [Creating the Instrumentator](#creating-the-instrumentator)\n  - [Adding metrics](#adding-metrics)\n  - [Creating new metrics](#creating-new-metrics)\n  - [Perform instrumentation](#perform-instrumentation)\n  - [Specify namespace and subsystem](#specify-namespace-and-subsystem)\n  - [Exposing endpoint](#exposing-endpoint)\n- [Contributing](#contributing)\n- [Licensing](#licensing)\n\n<!--TOC-->\n\n## Disclaimer\n\nNot made for generic Prometheus instrumentation in Python. Use the Prometheus\nclient library for that. This packages uses it as well.\n\nAll the generic middleware and instrumentation code comes with a cost in\nperformance that can become noticeable.\n\n## Features\n\nBeyond the fast track, this instrumentator is **highly configurable** and it is\nvery easy to customize and adapt to your specific use case. Here is a list of\nsome of these options you may opt-in to:\n\n- Regex patterns to ignore certain routes.\n- Completely ignore untemplated routes.\n- Control instrumentation and exposition with an env var.\n- Rounding of latencies to a certain decimal number.\n- Renaming of labels and the metric.\n- Metrics endpoint can compress data with gzip.\n- Opt-in metric to monitor the number of requests in progress.\n\nIt also features a **modular approach to metrics** that should instrument all\nFastAPI endpoints. You can either choose from a set of already existing metrics\nor create your own. And every metric function by itself can be configured as\nwell.\n\n## Advanced Usage\n\nThis chapter contains an example on the advanced usage of the Prometheus FastAPI\nInstrumentator to showcase most of it's features.\n\n### Creating the Instrumentator\n\nWe start by creating an instance of the Instrumentator. Notice the additional\n`metrics` import. This will come in handy later.\n\n```python\nfrom prometheus_fastapi_instrumentator import Instrumentator, metrics\n\ninstrumentator = Instrumentator(\n    should_group_status_codes=False,\n    should_ignore_untemplated=True,\n    should_respect_env_var=True,\n    should_instrument_requests_inprogress=True,\n    excluded_handlers=[\".*admin.*\", \"/metrics\"],\n    env_var_name=\"ENABLE_METRICS\",\n    inprogress_name=\"inprogress\",\n    inprogress_labels=True,\n)\n```\n\nUnlike in the fast track example, now the instrumentation and exposition will\nonly take place if the environment variable `ENABLE_METRICS` is `true` at\nrun-time. This can be helpful in larger deployments with multiple services\ndepending on the same base FastAPI.\n\n### Adding metrics\n\nLet's say we also want to instrument the size of requests and responses. For\nthis we use the `add()` method. This method does nothing more than taking a\nfunction and adding it to a list. Then during run-time every time FastAPI\nhandles a request all functions in this list will be called while giving them a\nsingle argument that stores useful information like the request and response\nobjects. If no `add()` at all is used, the default metric gets added in the\nbackground. This is what happens in the fast track example.\n\nAll instrumentation functions are stored as closures in the `metrics` module.\n\nClosures come in handy here because it allows us to configure the functions\nwithin.\n\n```python\ninstrumentator.add(metrics.latency(buckets=(1, 2, 3,)))\n```\n\nThis simply adds the metric you also get in the fast track example with a\nmodified buckets argument. But we would also like to record the size of all\nrequests and responses.\n\n```python\ninstrumentator.add(\n    metrics.request_size(\n        should_include_handler=True,\n        should_include_method=False,\n        should_include_status=True,\n        metric_namespace=\"a\",\n        metric_subsystem=\"b\",\n    )\n).add(\n    metrics.response_size(\n        should_include_handler=True,\n        should_include_method=False,\n        should_include_status=True,\n        metric_namespace=\"namespace\",\n        metric_subsystem=\"subsystem\",\n    )\n)\n```\n\nYou can add as many metrics you like to the instrumentator.\n\n### Creating new metrics\n\nAs already mentioned, it is possible to create custom functions to pass on to\n`add()`. This is also how the default metrics are implemented.\n\nThe basic idea is that the instrumentator creates an `info` object that contains\neverything necessary for instrumentation based on the configuration of the\ninstrumentator. This includes the raw request and response objects but also the\nmodified handler, grouped status code and duration. Next, all registered\ninstrumentation functions are called. They get `info` as their single argument.\n\nLet's say we want to count the number of times a certain language has been\nrequested.\n\n```python\nfrom typing import Callable\nfrom prometheus_fastapi_instrumentator.metrics import Info\nfrom prometheus_client import Counter\n\ndef http_requested_languages_total() -> Callable[[Info], None]:\n    METRIC = Counter(\n        \"http_requested_languages_total\",\n        \"Number of times a certain language has been requested.\",\n        labelnames=(\"langs\",)\n    )\n\n    def instrumentation(info: Info) -> None:\n        langs = set()\n        lang_str = info.request.headers[\"Accept-Language\"]\n        for element in lang_str.split(\",\"):\n            element = element.split(\";\")[0].strip().lower()\n            langs.add(element)\n        for language in langs:\n            METRIC.labels(language).inc()\n\n    return instrumentation\n```\n\nThe function `http_requested_languages_total` is used for persistent elements\nthat are stored between all instrumentation executions (for example the metric\ninstance itself). Next comes the closure. This function must adhere to the shown\ninterface. It will always get an `Info` object that contains the request,\nresponse and a few other modified informations. For example the (grouped) status\ncode or the handler. Finally, the closure is returned.\n\n**Important:** The response object inside `info` can either be the response\nobject or `None`. In addition, errors thrown in the handler are not caught by\nthe instrumentator. I recommend to check the documentation and/or the source\ncode before creating your own metrics.\n\nTo use it, we hand over the closure to the instrumentator object.\n\n```python\ninstrumentator.add(http_requested_languages_total())\n```\n\n### Perform instrumentation\n\nUp to this point, the FastAPI has not been touched at all. Everything has been\nstored in the `instrumentator` only. To actually register the instrumentation\nwith FastAPI, the `instrument()` method has to be called.\n\n```python\ninstrumentator.instrument(app)\n```\n\nNotice that this will do nothing if `should_respect_env_var` has been set during\nconstruction of the instrumentator object and the respective env var is not\nfound.\n\n### Specify namespace and subsystem\n\nYou can specify the namespace and subsystem of the metrics by passing them in\nthe instrument method.\n\n```python\nfrom prometheus_fastapi_instrumentator import Instrumentator\n\n@app.on_event(\"startup\")\nasync def startup():\n    Instrumentator().instrument(app, metric_namespace='myproject', metric_subsystem='myservice').expose(app)\n```\n\nThen your metrics will contain the namespace and subsystem in the metric name.\n\n```sh\n# TYPE myproject_myservice_http_request_duration_highr_seconds histogram\nmyproject_myservice_http_request_duration_highr_seconds_bucket{le=\"0.01\"} 0.0\n```\n\n### Exposing endpoint\n\nTo expose an endpoint for the metrics either follow\n[Prometheus Python Client](https://github.com/prometheus/client_python) and add\nthe endpoint manually to the FastAPI or serve it on a separate server. You can\nalso use the included `expose` method. It will add an endpoint to the given\nFastAPI. With `should_gzip` you can instruct the endpoint to compress the data\nas long as the client accepts gzip encoding. Prometheus for example does by\ndefault. Beware that network bandwith is often cheaper than CPU cycles.\n\n```python\ninstrumentator.expose(app, include_in_schema=False, should_gzip=True)\n```\n\nNotice that this will to nothing if `should_respect_env_var` has been set during\nconstruction of the instrumentator object and the respective env var is not\nfound.\n\n## Contributing\n\nPlease refer to [`CONTRIBUTING.md`](CONTRIBUTING).\n\nConsult [`DEVELOPMENT.md`](DEVELOPMENT.md) for guidance regarding development.\n\nRead [`RELEASE.md`](RELEASE.md) for details about the release process.\n\n## Licensing\n\nThe default license for this project is the\n[ISC License](https://choosealicense.com/licenses/isc). A permissive license\nfunctionally equivalent to the BSD 2-Clause and MIT licenses, removing some\nlanguage that is no longer necessary. See [`LICENSE`](LICENSE) for the license\ntext.\n\nThe [BSD 3-Clause License](https://choosealicense.com/licenses/bsd-3-clause) is\nused as the license for the\n[`routing`](src/prometheus_fastapi_instrumentator/routing.py) module. This is\ndue to it containing code from\n[elastic/apm-agent-python](https://github.com/elastic/apm-agent-python). BSD\n3-Clause is a permissive license similar to the BSD 2-Clause License, but with a\n3rd clause that prohibits others from using the name of the copyright holder or\nits contributors to promote derived products without written consent. The\nlicense text is included in the module itself.\n",
    "bugtrack_url": null,
    "license": "ISC",
    "summary": "Instrument your FastAPI with Prometheus metrics.",
    "version": "7.0.0",
    "project_urls": {
        "Homepage": "https://github.com/trallnag/prometheus-fastapi-instrumentator",
        "Repository": "https://github.com/trallnag/prometheus-fastapi-instrumentator"
    },
    "split_keywords": [
        "prometheus",
        "instrumentation",
        "fastapi",
        "exporter",
        "metrics"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "59662e93a8f56adb51ede41d0ef5f4f0277522acc4adc87937f5457b7b5692a8",
                "md5": "4b33377d2794525688e0f60c35eef246",
                "sha256": "96030c43c776ee938a3dae58485ec24caed7e05bfc60fe067161e0d5b5757052"
            },
            "downloads": -1,
            "filename": "prometheus_fastapi_instrumentator-7.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4b33377d2794525688e0f60c35eef246",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8.1,<4.0.0",
            "size": 19005,
            "upload_time": "2024-03-13T16:25:03",
            "upload_time_iso_8601": "2024-03-13T16:25:03.687615Z",
            "url": "https://files.pythonhosted.org/packages/59/66/2e93a8f56adb51ede41d0ef5f4f0277522acc4adc87937f5457b7b5692a8/prometheus_fastapi_instrumentator-7.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0e42eeb55ea9b0eae7d6854bef6aef3ecd34674f85813bc3877efdaeb582ab7e",
                "md5": "b372e89ee6b4bf1bc4df32be09570882",
                "sha256": "5ba67c9212719f244ad7942d75ded80693b26331ee5dfc1e7571e4794a9ccbed"
            },
            "downloads": -1,
            "filename": "prometheus_fastapi_instrumentator-7.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "b372e89ee6b4bf1bc4df32be09570882",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8.1,<4.0.0",
            "size": 20077,
            "upload_time": "2024-03-13T16:25:08",
            "upload_time_iso_8601": "2024-03-13T16:25:08.564132Z",
            "url": "https://files.pythonhosted.org/packages/0e/42/eeb55ea9b0eae7d6854bef6aef3ecd34674f85813bc3877efdaeb582ab7e/prometheus_fastapi_instrumentator-7.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-13 16:25:08",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "trallnag",
    "github_project": "prometheus-fastapi-instrumentator",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "prometheus-fastapi-instrumentator"
}
        
Elapsed time: 0.23524s