Code Monkey home page Code Monkey logo

Comments (8)

nasonfish avatar nasonfish commented on May 20, 2024 17

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.

ath88 avatar ath88 commented on May 20, 2024 4

I added an option that makes this far easier. Check out #101.

from express-prom-bundle.

shaharsol avatar shaharsol commented on May 20, 2024 2

@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.

shaharsol avatar shaharsol commented on May 20, 2024 1

My other issue with that solution is that I can't seem to use the ordering of the uses 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.

goooseman avatar goooseman commented on May 20, 2024

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.

poteirard avatar poteirard commented on May 20, 2024

It works like a charm. Thanks a lot for the code and the comments !

from express-prom-bundle.

lehno avatar lehno commented on May 20, 2024

Same problem as you @shaharsol

from express-prom-bundle.

elaijuh avatar elaijuh commented on May 20, 2024

if (opts.autoregister && path.match(metricsMatch)) {

@shaharsol

from express-prom-bundle.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.