ARCHIVED Turns out https://github.com/Gr1N/aiodogstatsd can do what this code was supposed to do. Go use it instead, it is excellent.
An ASGI middleware to emit metrics to statsd for requests
Mostly designed to work with Datadog, but should work with any statsd metric
statsd_client: Pass along your own statsd client. Must implement increment and timing methods
statsd_options: Options to configure the datadog statsd client
service: Name of your service, prepended to all metrics. Defaults to asgi
logger: optional logger
{service_name}.path
i.e.
myservice.api.v1.foo
Emits timing metrics for each endpoint for requests. Will emit clock time and cpu time. ## Tags =======
type: wall or cpu, depending on time source
status_code: The status code of the http request
method: the http method (get, post, put, delete) # StatusCodeMetricsMiddleware =============================
Emits counter metrics for each endpoint ## Tags =======
status_code: The status code of the http request
method: the http method (get, post, put, delete)
This ASGI middleware should work with any Starlette app, but I work with FastAPI so that's the example I've got for you. PRs welcome for more examples
from fastapi import FastAPI
app = FastAPI()
from statsd_asgi import TimingMiddleware, StatusCodeMetricsMiddleware
from logging import getLogger
statsd*options = {'statsd*host': os.environ.get("STATSD_HOST"),
'statsd\_port': os.environ.get("STATSD\_PORT")
}
app.add*middleware(TimingMiddleware, service="testapi", statsd*options=statsd_options)
app.add*middleware(StatusCodeMetricsMiddleware, service="testapi", statsd*client=statsd_options)
@app.get("/api")
async def root():
return {"message": "Hello World"}