Monitoring of CareShare using Prometheus & Grafana

We recently had to setup metrics monitoring for CareShare. CareShare’s backend is a node.js application that is being run using PM2 clusters. This article explains our use-case & details of setting up a grafana dashboard for your application. This article would be helpful to anyone wanting to collect metrics for their application which use PM2 as a process manager and runs in cluster mode.

PM2 is a daemon process manager that will help you manage and keep your application online 24/7

Before we begin, this article assumes the reader knows about the meaning and usage of the following technologies and terms:

  1. Node.js and express
  2. PM2 process manager
  3. Metrics
  4. Docker
  5. REST API
  6. IP Address

The Issue

So, where does the problem lie? Why can’t we simply setup metrics for the application like any other node.js application metrics? We can if we want to use proprietary and paid tool; for instance pm2-io-apm, which is designed specifically for PM2. However, if you are like us and falling towards the opensource side, read further!

Instance refers to a single running worker of the application.

In PM2 clustering, all the instances of the application are running separately with PM2 as the master process, right? So, now when we sent a request to get metrics, PM2 allocates the request to a single instance which will provide us with it’s own metrics and not the aggregated metrics of all the instances that are currently running. This will give metrics of only one of the instance at a time and it’ll be changing randomly with every request made to the metrics endpoint. Isn’t that an issue?

Setting up metrics on an instance basis

The first step towards setting up metrics for our application, is installing the appropriate libraries. We’ll be using express-prom-bundle and graphql-metrics. Below is the code that is required to be setup for the express app,

We have only shown imports pertaining to the two libraries we have mentioned above, there could be other imports required as well.



import promBundle from 'express-prom-bundle';
import createMetricsPlugin from 'apollo-metrics';

const app = express();
// metrics for graphql requests
const apolloMetricsPlugin = createMetricsPlugin(register);
// metrics for rest requests
app.use(
    promBundle({
        autoregister: false, // disable /metrics for single workers
        includeMethod: true,
        includeStatusCode: true,
        includePath: true,
        promRegistry: register,
    }),
);

The important step here is using the same promRegistry for both the middlewares so that their metrics are together. Also, it is important to set autoRegister to False since we do not want the /metrics endpoint to be created by promBundle.

Middleware functions are functions that have access to the request object (req), the response object (res), and the next middleware function in the application’s request-response cycle.

Aggregating metrics from all instances

Now, since we have setup metrics on a per instance basis, we move on to the aggregation part. Remember we did not create the /metrics endpoint earlier? We will create it now and send aggregated metrics from all processes using the library pm2-cluster-prometheus. Following code is the updated code with the use of the library.



const app = express();
const aggregatorRegistry = new AggregatorRegistry();
// register for prometheus aggregation
app.get('/metrics', async (_, res) => {
    const metrics = await getAggregateMetrics();
    res.set('Content-Type', aggregatorRegistry.contentType);
    res.send(metrics.metrics());
});
// metrics for graphql requests
const apolloMetricsPlugin = createMetricsPlugin(register);
// metrics for rest requests
app.use(
    promBundle({
        autoregister: false, // disable /metrics for single workers
        includeMethod: true,
        includeStatusCode: true,
        includePath: true,
        promRegistry: register,
    }),
);

That’s it! Now the metrics that we get from /metrics is the aggregated metrics from all the instances using the default prometheus registry. This aggregation has a limitation that it can only aggregate from default registry and therefore cannot be used with libraries (for example swagger-stats) which don’t allow setting register and use their own register and endpoint.

A GitHub issue has been raised for swagger-stats regarding the same, #114

NOTE: I’m not sure about the fact that aggregation is only possible from default registry, however I’ve not found any example or documentation saying otherwise.

Setting up Prometheus & Grafana

Having made available the aggregated metrics from our instances, it is time to setup Prometheus and Grafana. The process is very straight-forward using dockprom. One should be familiar with how to install Docker and follow the instructions laid down in the readme for rest of the process.

dockprom is a monitoring solution for Docker hosts and containers with Prometheus, Grafana, cAdvisor, NodeExporter and alerting with AlertManager.

Once we have the docker containers running, we need to add the following configuration under scrape_configs in prometheus/prometheus.yml which would allow prometheus to pull metrics from our application.



- job_name: APP_NAME
  scrape_interval: 5s
  scrape_timeout: 5s
  metrics_path: /metrics
  scheme: http
  static_configs:
    - targets: ['YOUR_INTERNAL_IP:5000'] // assuming application is running on port 5000

YOUR_INTERNAL_IP is the IP address of your machine which the prometheus docker-container can use to access the /metrics endpoint. This can be either your global IP address or the IP address alloted to your machine on the network. The command ip address when run in terminal gives the information about all the network devices and associated IP address. As an example, below is the address I would have put when running in my machine.

output of ip address command

For Grafana, I’ve create a dashboard (shown below) which shows basic information about the application. You can find the configuration for the dashboard in this GitHub issue and download the JSON and add it in the folder grafana/provisioning/dashboards/.

Grafana dashboard

Conclusion

Jeśli szukasz miejsca do gry w jednorękiego bandytę w Polsce, to wiedz, że znajdziesz wiele opcji metod płatności. Większość polskie legalne kasyno online akceptuje karty kredytowe i debetowe, przelewy bankowe i e-portfele. Większość z tych opcji jest bezpieczna i niezawodna. Możesz także użyć kryptowaluty do płacenia za depozyty hazardowe. W przeciwieństwie do tradycyjnych metod wpłat w kasynie, te metody kryptograficzne są tańsze i nie wymagają weryfikacji przez osoby trzecie. Najlepsze kasyna online w Polsce oferują różne rodzaje bonusów. Wiele z nich ma bonusy powitalne, które odpowiadają pierwszej wpłacie do określonej kwoty. Następnie możesz sprawdzić swoje szczęście i wygrać prawdziwe pieniądze. Alternatywnie, możesz wpłacić dowolną kwotę, a następnie grać do syta. Wybór nalezy do ciebie! A ponieważ jest tak wiele gier do wyboru, nigdy się nie znudzisz ani nie zmęczysz. Ponadto możesz znaleźć wiele kasyn online w Polsce, które oferują gry, które kochasz. Sytuacja w Polsce jest skomplikowana. Jest wciąż na wczesnym etapie i nie odnotowuje szybkiego wzrostu w porównaniu z innymi, bardziej rozwiniętymi rynkami. Jednak rząd poczynił kroki w kierunku zezwolenia na hazard online. W rzeczywistości polski rynek hazardowy ma potencjał, by stać się największą branżą w Europie Wschodniej. Mając wszystkie te czynniki, będziesz w stanie znaleźć kasyno, które odpowiada Twoim potrzebom i Twojemu budżetowi. Czas cieszyć się ulubionymi grami w kasynie online w Polsce! Chociaż istnieje wiele korzyści z grania w sloty online w Polsce, musisz pamiętać, że wiąże się to również z ryzykiem. Podczas gdy polskie przepisy dotyczące hazardu są bardzo surowe, obcokrajowcy mogą grać w dowolnym kasynie online. Jeśli mieszkasz w Polsce, powinieneś wybrać kasyno online, które akceptuje polskie złote. Oprócz tego powinieneś również poszukać kasyna, które ma dobrą reputację w innych krajach i ma dużą bazę klientów. Sektor hazardowy w Polsce był kiedyś w dużej mierze nieuregulowany, z bardzo nielicznymi ograniczeniami. Jednak sytuacja zmieniła się drastycznie w połowie 2000 roku, kiedy kraj uchwalił ustawę o grach hazardowych. Ustawa ta zakazuje obecnie wszelkich form hazardu online, z wyjątkiem zakładów za pośrednictwem akceptowalnych produktów. Dlatego w Polsce istnieje wiele kasyn online z implikacjami prawnymi. A jeśli masz szczęście, będziesz w stanie znaleźć odpowiednie kasyno online w Polsce. Dobrą wiadomością jest to, że Polska ma wiele kasyn online, które akceptują graczy z kraju. Od blackjacka po ruletkę, będziesz miał duży wybór. Bez względu na to, jakie masz preferencje, w Polsce możesz znaleźć wiele okazji do uprawiania hazardu. Przed podjęciem ostatecznej decyzji zapoznaj się tylko z zaletami i wadami każdego z nich. Będziesz zadowolony, że to zrobiłeś. Nagrody i korzyści płynące z gry w kasynach online w Polsce są warte ryzyka!
Si vous habitez en France et que vous cherchez un nouveau casino francais en ligne, vous êtes au bon endroit ! Que vous soyez un joueur passionné de machines à sous, un vétéran chevronné ou quelque part entre les deux, il y a un casino en ligne pour vous. Les résidents français apprécieront la grande variété de jeux disponibles et les nombreuses façons de gagner de l’argent réel. En plus des nombreux jeux, vous pouvez également vous attendre à trouver un support client français par chat en direct, par e-mail ou par téléphone. Les autorités françaises des jeux de hasard ne réglementent pas les jeux de casino en ligne aussi libéralement que les Américains, mais cela n’empêche pas les joueurs de jouer dans les meilleurs casinos en ligne disponibles. Les joueurs français peuvent accéder à la plupart des sites de jeu internationaux. La clé est de trouver un casino en ligne fiable et sûr qui propose les jeux dont ils ont envie. Les joueurs français peuvent faire confiance à nos critiques et notre équipe a fait le travail acharné pour vous. Nous avons pris le temps de rechercher tous les casinos français en ligne, pour que vous n’ayez pas à le faire ! Le gouvernement français impose certaines limites au nombre de casinos en ligne disponibles pour les résidents français. L’âge minimum pour jouer a été abaissé de 21 à 18 ans en 1987 et les machines à sous ont été rendues légales. Alors que les joueurs français ne peuvent pas accéder aux comptes de jeu en ligne, ils peuvent profiter des jeux de casino d’opérateurs étrangers. Cependant, les joueurs français étant taxés sur leurs gains, de nombreux joueurs optent pour des opérateurs étrangers sans licence. Bien que le gouvernement français n’interdise pas de jouer sur des sites sans licence, il rend plus difficile pour les joueurs de retirer leurs gains. Le jeu en France est légal en France et est réglementé par l’ARJEL, qui est l’autorité des jeux en France. Alors que les jeux d’argent en ligne sont légaux en France, certains sites ont fermé en raison de taux d’imposition élevés. Cela a rendu la scène française du jeu moins attrayante pour les joueurs de casino, les professionnels du poker et les parieurs sportifs. Heureusement, il existe encore un certain nombre de choix décents pour les joueurs français. Il existe plusieurs casinos en ligne sous licence française à la disposition des joueurs français. Bien que les lois françaises sur les jeux de hasard soient plus souples que dans certains pays, c’est toujours une bonne idée de jouer de manière responsable. Même si les lois françaises sur les jeux d’argent ne sont pas aussi strictes que celles des autres pays européens, les lois du pays limitent toujours le nombre d’activités et de sites de jeux d’argent. Par conséquent, si vous vivez en France et que vous souhaitez jouer légalement, vous pouvez plutôt envisager un casino offshore. Les jeux d’argent en ligne en France présentent de nombreux avantages, et les casinos offshore offrent les meilleurs jeux et bonus aux joueurs français. La loi sur les jeux d’argent a mis fin au monopole du gouvernement sur les jeux d’argent et a autorisé les jeux en ligne en France. La loi autorise désormais les paris sportifs, les paris hippiques et le poker. Cependant, il a restreint les jeux de casino traditionnels comme le blackjack, la roulette et le poker pour qu’ils ne soient joués qu’en ligne. Cependant, il laisse encore le marché français du jeu largement ouvert à la concurrence étrangère. C’est une bonne chose pour les joueurs en France et les amateurs de jeux d’argent français. Alors, ne vous inquiétez pas ! Il existe désormais des casinos en ligne français, et il est plus facile que jamais de se lancer !
Players should also note that Ignition is part of the Bodog family, which means they benefit from the expertise and stellar reputation at this website Bodog brand. Ignition is also supported on most modern mobile platforms, including iOS, Android, and Windows. Moreover, Ignition’s website is responsive and doesn’t require apps.
It is possible to play online casino games australia real money, provided you have a valid credit card. In fact, many Australian online casinos offer a range of payment methods, including Visa, MasterCard, and Bitcoin. You can play online pokies for free to learn the game rules before you start playing for real money. In addition to this, Australian online casinos also offer free play on their website so that you can try out their games before committing any money. Many Australian online casinos offer a VIP program that offers special bonuses, like a welcome bonus of up to $300. This program also includes regular free spins on slots. These free rounds of slots require no deposit or wagering. Make sure to read the rules of the promotions to avoid forfeiting your free spins. Then, play responsibly. You could win AU$1 million in a single night! You could even win a Ferrari! Depositing funds into your account is easy. Deposits can be made by using various payment methods such as Visa, MasterCard, and Ewallets. Australians can also use bank transfers and eWallets to fund their accounts. While many online casinos accept credit cards, most require a minimum deposit of A$50 to qualify for a welcome bonus. You can also deposit with cryptocurrency. However, you must ensure that you have sufficient Bitcoin to cover the minimum deposit amount required. While online Aussie Casinos are a great way to play games, some players prefer to interact with other players while playing. For example, some of them feature live sporting events, such as soccer, cricket, and Formula One. While there are risks associated with playing casino games online, these bonuses can help you improve your overall gaming experience and increase your chances of winning. A live dealer is a good option if you prefer to play in a real casino. If you’re looking to try out casino games online in Australia, pokies should be your first choice. Australian online casinos offer several variations of this popular game. Players can play against the dealer, or play against the computer. Some of the most popular varieties of pokies include Texas Hold’em, Caribbean Hold’Em, and 3 Card Poker. In addition to pokies, Australian casinos offer video poker. Video poker is a hybrid of Poker and Online Pokies, with similar card ranking systems. Although it’s a simpler game to play, some versions of Video Poker even have the lowest house edge. While most Australian online casinos accept credit cards as a form of real cash, some offer payment options other than credit cards. Debit cards are the most convenient method of cash-based transactions. To play casino games in Australia using a debit card, all you need to do is sign up for an account at Neteller and then deposit real cash into it. Neteller will then transfer that money directly to your casino account. The only drawback of Neteller is that it will ask if the money is intended for gambling.

There are multiple other methods to achieve the same. We tried almost all the existing methods before using aggregator as, unfortunately, none of them worked for me. If it is useful to you, which I believe it will be since you are using PM2 clustering, for resources level metrics we found pm2-prometheus-exporter really useful and it has a dashboard as well :smile:

We hope this was useful! Do give us feedback & write to us on devs@zealth-ai.com


Other Approaches

Followings is a list of other approaches to the same problem:

  • https://github.com/slanatech/swagger-stats/issues/29
  • https://stackoverflow.com/questions/48436714/aggregate-metrics-in-child-workers-for-pm2-cluster-mode
  • https://stackoverflow.com/questions/51118808/export-pm2-cluster-stats-to-prometheus