c-lightning Plugins 03: The Prometheus Plugin

c-lightning Plugins 03: The Prometheus Plugin
Powering stats for c-lightning

By Lisa Neigut and Martin Izdimirski

Overview

  • Purpose: Output Lightning node data to a monitoring platform for charting and alerts
  • Language: Python
  • Code: Github
  • Documentation: README

The Prometheus Plugin

Sometimes you want to obtain information about your Lightning node’s performance at a glance, without having to dive in to the command line or log into your node.

The Prometheus plugin, written by Christian Decker, turns your c-lightning node into a data source for Prometheus, a third-party timeseries datastore. Collecting node data in Prometheus enables us to chart it with Grafana and set up alerts with the Prometheus Alertmanager.

This is particularly useful for c-lightning node installations in mission critical applications, where you need to be able to quickly view and respond to outages or alerts.

At Blockstream we run a number of production Lightning nodes, most notably the Blockstream Store and the payment system for the Blockstream Satellite. By plugging in our node stats in Prometheus and Grafana, we have visibility into our production systems and timely alerts for system problems.

Technical Details

In this article we’ll briefly explain how Prometheus works, demonstrate how to use Docker to install it alongside your c-lightning node, share a few graphs in Grafana that we find useful, and finally give an example of how you can set up alerts.

Setup

You will need Docker installed in order to run all the different services as Docker containers. These instructions assume you are running a Bitcoin full node.

Before we can view pretty graphs, we need to set up our c-lightning node, Prometheus and Grafana. We’ll be using the official Prometheus and Grafana Docker images, which are maintained by their respective organizations.

A quick note on security: this setup is mainly using default settings. Don’t forget to do your own due diligence and go through the appropriate configuration options and security recommendations for your setup.

Setting up our c-lightning node for Prometheus

By default, the plugin will collect stats from c-lightning and expose them locally at port 9900. This is defined in the prometheus plugin, and can be configured with the prometheus-listen option:

prometheus configuration python
prometheus configuration python. GitHub Gist: instantly share code, notes, and snippets.

We have set up Prometheus to scrape this port in the lightningd job in the prometheus.yaml (see below).

Now, let’s bring up a LN node on mainnet using Docker. The Prometheus plugin has already been installed in the blockstream/lightningd:prom Docker image that we will use. You can review the Dockerfile that was used to build the Docker image here. You’ll have to take our word for having used that exact Dockerfile for the image, or you can build it yourself :).

Next, we need to configure our Lightning node. Here’s a basic lightning.conf:

Example lightning conf
Example lightning conf . GitHub Gist: instantly share code, notes, and snippets.

The lightning.conf has a plugin-dir option, which tells lightningd where to look for pre-installed plugins; the default directory is ~/.lightning/plugins. We’re not using the default, so we set it here.

For more information on lightningd configuration options, see the docs or run docker run blockstream/lightningd:prom lightningd — help.

Let’s start the c-lightning container. Create a ~/extra/lightning directory, and make a lightning.conf file inside of that. Then run:

Command to start c-lightning with Docker
Command to start c-lightning with Docker. GitHub Gist: instantly share code, notes, and snippets.

Once this has been completed, you should have a lightning node running locally with the Prometheus plugin enabled. Test it with curl localhost:9900 or run a curl command inside the container — docker exec lightning curl localhost:9900. That should return some text that Prometheus will be able to understand.

Monitoring Setup

Prometheus

Now, let’s setup Prometheus. By default, Prometheus collects metrics from specified endpoints. It will scrape for messages on a port (in our case 9900) and it will store those metrics for you in a time-series database.

The Prometheus configuration is stored in prometheus.yaml. Our example is very simple — it tells prometheus where to look for its alerting rules, how to communicate with Alertmanager (if you decide to use it) and a single scrape job that specifies the job name, scrape interval and the endpoint.

If you’re on a Mac, you may need to replace localhost with 172.17.0.1 (the docker bridge network).

Prometheus config
Prometheus config. GitHub Gist: instantly share code, notes, and snippets.

We also need to create an alerts.yaml file, which will contain our various alerting rules. Alerts have a query expression (expr) line, which specifies what Prometheus should alert on. More useful functions for alert expressions can be found in the Prometheus docs. Try out different alerts in Prometheus’ Graph tab (localhost:9090/graph).

Here’s a basic example with two alerts:

Alertmanager Config
Alertmanager Config. GitHub Gist: instantly share code, notes, and snippets.

Start the Prometheus container. Make sure you have created the necessary directories, in this case ~extra/prom/data, ~/extra/prom/prometheus.yaml, and ~/extra/prom/alerts.yaml.

If you’re using a Mac, replace ` — network=host` with `-p 9090:9090`.

Command to start Prometheus
Command to start Prometheus. GitHub Gist: instantly share code, notes, and snippets.

You can go to localhost:9090/targets to verify that Prometheus can find your c-lightning node — its state should be UP.

If you’re getting context deadline exceeded or connection refused messages, make sure prometheus can reach your c-lightning node’s scrape metrics at localhost:9900 (Use docker exec -it prometheus bash to debug from within the container). Another useful debugging tip: on /alerts, click on each expression and test if it returns anything when you remove the condition == 0. If you see non-zero values, the alert isn’t active. That’s a good thing — you have peers and you can see your node’s info.

Alertmanager provides a lot of integrations for delivering the alert: SMTP Smarthost, OpsGenie, Slack, etc.

Here’s an example on how to use Google’s SMTP relay and OpsGenie. You’ll need to update this with the appropriate email_configs, and api_key.

Alertmanager Config
Alertmanager Config. GitHub Gist: instantly share code, notes, and snippets.

Start the Alertmanager container:

Command to start Alertmanager
Command to start Alertmanager. GitHub Gist: instantly share code, notes, and snippets.

Great! Now we’ve got Prometheus and Alertmanager set up. You’re ready for your first outage.

Grafana

It’d be nice if we had better visibility into our node even when there isn’t an alarm going off. For this, we’ll setup Grafana, a best-in-class graphing service that works well with Prometheus.

To link up Grafana with our Prometheus data, we’ve provided a datasource file. With it, Grafana will install your local Prometheus as a data source. This will link the two services without any additional configuration on your part.

Datasource config to connect Prometheus <-> c-lightning plugin
Datasource config to connect Prometheus <-> c-lightning plugin - ln-prom.yml

Start the Grafana container. Again, make sure you have created the appropriate directories: ~/extra/grafana, ~/extra/grafana/data, ~/extra/grafana/provisioning, and that you’ve placed the above datasource config in the correct place.

Command to start Grafana container
Command to start Grafana container. GitHub Gist: instantly share code, notes, and snippets.

Seeing Lightning with Grafana

When Grafana is launched, you should see the login page at http://localhost:3000. (It can take up to 30s for Grafana to start up.) The default login credentials are admin/admin. After you login, you’ll be able to create your first dashboard:

Click on New Dashboard -> Add Query -> Select LN from the Query dropdown -> Select a lightning metric from the Metrics dropdown.

Try seeing all your channels, or your htlc throughput. Once you have a set of graphs you like, save the Dashboard by clicking the diskette at the top right.

Here’s a closer look at the dashboard panel for tracking our active peers over time. We have three different nodes that we’re using, so we’ve added a separate query for each one:

Another useful graph is to know the current balance of your total funds that is currently locked up into channels. You can use a gauge to create a current snapshot for your node.

The query for this is simply.

You can do the same for funds committed to channels with

That’s all there is to it. If you’d like to use the dashboards we’ve made, you can find the JSON for the many node overview here. The JSON for more useful single node statistics is here. Note that this one has a dropdown list that allows you to select a specific node to view the stats for. If you only have one node, you’ll want to remove all of the ‘instance’ references.

Putting it All Together with docker-compose

You can run each Docker container as outlined above independently, but for your convenience we’re including a docker-compose file, which should allow you to run it all by issuing a single command — docker-compose up -d (Note: you may need to install docker-compose).

docker-compose may not be ideal for production environments. Another approach would be to break the docker-compose.yaml into separate systemd services.

c-lightning with Prometheus, Alertmanager, and Grafana
c-lightning with Prometheus, Alertmanager, and Grafana - docker-compose.yaml

Get Started

Prometheus integration is just one of the many c-lightning plugins. You can find more community developed plugins on our plugin repository: lightningd/plugins.

Interested in building your own plugin? Check out our PLUGINS readme in the lightning Github repo, or check out Rusty Russell’s webinar on getting started with c-lightning.

This was the first showcase in a series on c-lightning plugins. For a regularly updated list of available articles, head to our introduction to c-lightning plugins.

Note: This blog was originally posted at https://medium.com/p/75c6d733a2a3

Core Lightning (previously c-lightning) is a lightweight, highly customizable and standard compliant implementation of the Lightning Network protocol.

© 2023 Core Lightning
All rights reserved.

Discussion Forum

The official Core Lightning forum is coming soon!

BuildonL2 Community

The official BuildOnL2 community lives at community.corelightning.org. Join us and build the future of bitcoin on lightning.

Mailing List

For general discussions about CLN implementation, use c-lightning@lists.ozlabs.org. For the Lightning Network, use lightning-dev@lists.linuxfoundation.org

Telegram

Community-driven telegram group where most of the node operators hang out. Go to https://t.me/lightningd to join.

Discord

Community-driven discord server where the devs flock together. Go to https://discord.gg/w27fMFESMN to join.

Internet Relay Chat

Don't hesitate to reach out to us on IRC at #lightning-dev @ libera.chat, #c-lightning @ libera.chat.