Comments (8)
Here's a solution that seems to work for me.
const app = express();
const metricsApp = express();
const metricsMiddleware = promBundle({
includeMethod: true,
includePath: true,
autoregister: false,
});
app.use(metricsMiddleware);
// app.use(.....)
app.listen(config.PORT, () => {
console.log('Server listening on port', config.PORT);
});
metricsApp.use(metricsMiddleware.metricsMiddleware);
metricsApp.listen(config.METRICS_PORT, () => {
console.log('Metrics listening on port', config.METRICS_PORT);
});
It appears to register the metrics endpoint correctly in the metrics server, while collecting the actual metrics from the app.
from express-prom-bundle.
I added an option that makes this far easier. Check out #101.
from express-prom-bundle.
@goooseman @poteirard just implemented this solution in my app and found out that indeed I can now access the /metrics
endpoint on port 9090, however I can still access the metrics via the main app port i.e localhost:3000/metrics
.
Am I missing something? Is there anyway to limit access to the metrics endpoint on the main app port?
Edit: I kinda work around this like so:
app.use('/metrics', (req, res) => {
res.send(401);
});
app.use(metricsRequestMiddleware);
But it feels hacky to me...
from express-prom-bundle.
My other issue with that solution is that I can't seem to use the ordering of the use
s to determine which route will be measured and which will not. Everything is included regardless of where I use
the metricsRequestMiddleware
.
from express-prom-bundle.
It is not so obvious, because this middleware attaches to express, which is listening on one of the ports. Middleware can not expose itself to a different port. This can not be solved by extending the API of this library, but can be done on the integration side in your code.
To solve this issue, we need one more express app, which has only /metrics
endpoint. But we need to register statistics from our main express app. In the end I came up with the following:
const express = require("express");
const promBundle = require("express-prom-bundle");
const metricsRequestMiddleware = promBundle({
includePath: true,
includeMethod: true,
autoregister: false, // Do not register /metrics
promClient: {
collectDefaultMetrics: {
},
},
});
const { promClient, metricsMiddleware } = metricsRequestMiddleware;
// promClient here is the prom-client object
// Metrics app to expose /metrics endpoint
const metricsApp = express();
metricsApp.use(metricsMiddleware);
module.exports = { metricsRequestMiddleware, metricsApp };
const express = require("express");
const app = express();
const { metricsRequestMiddleware } = require("@server/app/metrics");
// We are using metricsRequestMiddleware which register statistics from main express app
app.use(metricsRequestMiddleware);
const app = require("./server/app");
const { metricsApp } = require("./server/app/metrics");
const server = http.createServer(app); // Main server
const metricsServer = http.createServer(metricsApp); // Metrics server
server.listen(5000);
metricsServer.listen(9090);
from express-prom-bundle.
It works like a charm. Thanks a lot for the code and the comments !
from express-prom-bundle.
Same problem as you @shaharsol
from express-prom-bundle.
express-prom-bundle/src/index.js
Line 132 in 23cedb9
@shaharsol
from express-prom-bundle.
Related Issues (20)
- Missing documentation on combination of autoregister false and metricsApp HOT 2
- Intentional breaking changes? HOT 4
- Option to lowercase all paths HOT 2
- Option to erase series without requests for a given time HOT 6
- Adding prefix to "up" metric HOT 3
- Add labels to up metric
- @types/express should be marked as a peerDependency
- prom-client 15 compatibility HOT 1
- Unintentional(?) breaking peer dep change in 6.3.1 HOT 1
- Helped needed... HOT 2
- maxAgeSeconds not part of "opts" type HOT 1
- Type definitions do not include promRegistry as a configurable parameter HOT 1
- Package consuming 10gb of virtual memory HOT 5
- Allow a path whitelist option HOT 3
- excludeRoutes is missing from the TypeScript types HOT 1
- Disable http_request_duration_seconds HOT 3
- Cluster: Operation timed out. HOT 2
- Normalizing URL path: Replace #val with custom values/attributes HOT 1
- Missing `promClient` type in the `express_prom_bundle` interface HOT 6
- Disable http_request_duration_seconds_bucket and http_request_duration_seconds_count, but keep http_request_duration_seconds_sum HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from express-prom-bundle.