#prometheus-metrics #memcached #prometheus #key #regex #user #rules

bin+lib mkey_exporter

Export counts and sizes of Memcached keys matching regular expressions as Prometheus metrics

2 releases

0.1.2 Oct 11, 2023
0.1.1 Sep 21, 2023
0.1.0 Sep 21, 2023

#1063 in Database interfaces

GPL-3.0+

38KB
529 lines

mkey_exporter

build status docs.rs crates.io

Export counts and sizes of Memcached keys matching regular expressions as Prometheus metrics.

For example, with the Memcached keys:

thing-1:user-1:something
thing-1:user-1:something-different
thing-1:user-2:something
thing-1:user-3:something
thing-2:user-1:something
thing-2:user-1:something-else

And the YAML configuration:

name: demo
rules:
- pattern: '^(\w+):'
  label_name: 'thing'
  label_value: '$1'
- pattern: '^\w+:([\w\-]+):'
  label_name: 'user'
  label_value: '$1'

The following Prometheus metrics would be exported:

mkey_memcached_counts{user="user-1",thing="thing-1"} 2
mkey_memcached_counts{user="user-2",thing="thing-1"} 1
mkey_memcached_counts{user="user-3",thing="thing-1"} 1
mkey_memcached_counts{user="user-1",thing="thing-2"} 2

mkey_memcached_sizes{user="user-1",thing="thing-1"} 242
mkey_memcached_sizes{user="user-2",thing="thing-1"} 56
mkey_memcached_sizes{user="user-3",thing="thing-1"} 23
mkey_memcached_sizes{user="user-1",thing="thing-2"} 127

Using these metrics, you can determine what your Memcached cluster is caching based on rules that measure what's meaningful for your application.

Features

  • Export counts and sizes of cache entries in your Memcached cluster.
  • Extract Prometheus labels from keys based on powerful regular expressions.
  • Easy to understand YAML configuration format.
  • TLS Memcached connection support.

Install

There are multiple ways to install mkey_exporter listed below.

Binaries

Binaries are published for GNU/Linux (x86_64), Windows (x86_64), and MacOS (x86_64 and aarch64) for each release.

Docker

Docker images for GNU/Linux (x86_64, arm64) are published for each release.

Cargo

mkey_exporter along with its dependencies can be downloaded and built from source using the Rust cargo tool. Note that this requires you have a Rust toolchain installed.

To install:

cargo install mkey_exporter

To install as a completely static binary (Linux only):

cargo install --target x86_64-unknown-linux-musl mkey_exporter 

To uninstall:

cargo uninstall mkey_exporter

Source

mkey_exporter along with its dependencies can be built from the latest sources on Github using the Rust cargo tool. Note that this requires you have Git and a Rust toolchain installed.

Get the sources:

git clone https://github.com/56quarters/mkey_exporter.git && cd mkey_exporter

Install from local sources:

cargo install --path .

Install a completely static binary from local sources (Linux only):

cargo install --path . --target x86_64-unknown-linux-musl

To uninstall:

cargo uninstall mkey_exporter

Usage

Examples of running and configuring mkey_exporter are given below.

Running

mkey_exporter has a single required argument: the path to a YAML configuration file. Examples of invoking mkey_exporter with a variety of options are listed below. In each of these examples, config.yaml is a valid YAML configuration file. Example configuration files are listed below in the Config section or there is an example in the repository.

You can find information about all supported options by running mkey_exporter --help.

Connecting to a local server

mkey_exporter config.yaml

Connecting to a remote server

mkey_exporter --host cache01.example.com config.yaml

Connecting to a remote server over TLS

mkey_exporter --host cache01.example.com:11211 --tls-enabled --tls-ca memcached-ca-cert.pem --tls-cert memcached-client-cert.pem --tls-key memcached-client-key.pem config.yaml 

Enabling debug logging and a quicker refresh interval

mkey_exporter --log-level debug --refresh-secs 30 config.yaml

Config

mkey_exporter buckets Memcached keys using Prometheus labels based on rules that you define. The rules parse portions of the Memcached key and turn them into Prometheus label names and values. Some example configurations and the resulting prometheus metrics that would be generated are given below.

Each rule in an mkey_exporter configuration file parses a value for a particular Prometheus label from a Memcached key. Rules are evaluated in order. The first rule that sets a value for a particular label name "wins", no other rules that set that label name will be evaluated for a Memcached key.

The configuration format is defined as:

name: example                  # Name of this configuration, used for diagnostics.
rules:                         # Array of rules to apply, in order, for each Memcached key.
- pattern: '^(\w+):'           # Regular expression to apply to the Memcached key.
  label_name: 'store'          # Name of the label to emit, this may NOT contain regular expression captures.
  label_value: '$1'            # Value of the label to emit, this MAY contain regular expression captures.
- pattern: '^\w+:([\w\-]+):'   # You may include as many rules as you want, they will be evaluated in order
  label_name: 'user'           # for every Memcached key.
  label_value: '$1'

Examples

In the following examples, only the mkey_memcached_counts metric is shown for brevity.


This configuration sets two labels for metrics based on the Memcached keys.

Keys:

user-profile:user-1:backup
user-profile:user-1:latest
user-profile:user-2:latest
user-profile:user-3:latest
user-cart:user-1:latest

Rules:

name: example
rules:
- pattern: '^(\w+):'
  label_name: 'store'
  label_value: '$1'
- pattern: '^\w+:([\w\-]+):'
  label_name: 'user'
  label_value: '$1'

Metrics:

mkey_memcached_counts{user="user-1",store="user-profile"} 2
mkey_memcached_counts{user="user-2",store="user-profile"} 1
mkey_memcached_counts{user="user-3",store="user-profile"} 1
mkey_memcached_counts{user="user-1",store="user-cart"} 1

This configuration sets two labels for metrics based on the Memcached keys using multiple rules to set values for the "store" label.

Keys:

up:user-1:backup
up:user-1:latest
up:user-2:latest
up:user-3:latest
uc:user-1:latest
uu:user-1:latest

Rules:

name: example
rules:
- pattern: '^up:'
  label_name: 'store'
  label_value: 'user-profile'
- pattern: '^uc:'
  label_name: 'store'
  label_value: 'user-cart'
- pattern: '^\w+:'
  label_name: 'store'
  label_value: 'unknown'
- pattern: '^\w+:([\w\-]+):'
  label_name: 'user'
  label_value: '$1'

Metrics:

mkey_memcached_counts{user="user-1",store="user-profile"} 2
mkey_memcached_counts{user="user-2",store="user-profile"} 1
mkey_memcached_counts{user="user-3",store="user-profile"} 1
mkey_memcached_counts{user="user-1",store="user-cart"} 1
mkey_memcached_counts{user="user-1",store="unknown"} 1

Limitations

Every evaluation loop, mkey_exporter gets a complete list of keys from the Memcached server. This means the time taken for each update will increase based on the number of keys in the server. I've tested up to 3.5 million keys running on a server local to the mkey_exporter process with decent results (approximately a 5-second update time).

License

mkey_exporter is available under the terms of the GPL, version 3.

Contribution

Any contribution intentionally submitted for inclusion in the work by you shall be licensed as above, without any additional terms or conditions.

Dependencies

~22–35MB
~658K SLoC