@graphql-yoga/plugin-prometheus
Version:
Prometheus plugin for GraphQL Yoga.
63 lines (62 loc) • 2.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.usePrometheus = void 0;
const prometheus_1 = require("@envelop/prometheus");
const prom_client_1 = require("prom-client");
function headersToObj(headers) {
const obj = {};
headers.forEach((value, key) => {
obj[key] = value;
});
return obj;
}
function usePrometheus(options) {
const endpoint = options.endpoint || '/metrics';
const registry = options.registry || prom_client_1.register;
const httpHistogram = new prom_client_1.Histogram({
name: 'graphql_yoga_http_duration',
help: 'Time spent on HTTP connection',
labelNames: [
'url',
'method',
'requestHeaders',
'statusCode',
'statusText',
'responseHeaders',
],
registers: [registry],
});
const startByRequest = new WeakMap();
return {
onPluginInit({ addPlugin }) {
addPlugin((0, prometheus_1.usePrometheus)({ ...options, registry }));
},
async onRequest({ request, url, fetchAPI, endResponse }) {
startByRequest.set(request, Date.now());
if (url.pathname === endpoint) {
const metrics = await registry.metrics();
const response = new fetchAPI.Response(metrics, {
headers: {
'Content-Type': registry.contentType,
},
});
endResponse(response);
}
},
onResponse({ request, response }) {
const start = startByRequest.get(request);
if (start) {
const duration = Date.now() - start;
httpHistogram.observe({
url: request.url,
method: request.method,
requestHeaders: JSON.stringify(headersToObj(request.headers)),
statusCode: response.status,
statusText: response.statusText,
responseHeaders: JSON.stringify(headersToObj(response.headers)),
}, duration);
}
},
};
}
exports.usePrometheus = usePrometheus;