prometheus-net.Contrib.MongoDb
3.0.9
dotnet add package prometheus-net.Contrib.MongoDb --version 3.0.9
NuGet\Install-Package prometheus-net.Contrib.MongoDb -Version 3.0.9
<PackageReference Include="prometheus-net.Contrib.MongoDb" Version="3.0.9" />
paket add prometheus-net.Contrib.MongoDb --version 3.0.9
#r "nuget: prometheus-net.Contrib.MongoDb, 3.0.9"
// Install prometheus-net.Contrib.MongoDb as a Cake Addin #addin nuget:?package=prometheus-net.Contrib.MongoDb&version=3.0.9 // Install prometheus-net.Contrib.MongoDb as a Cake Tool #tool nuget:?package=prometheus-net.Contrib.MongoDb&version=3.0.9
prometheus-net.Contrib.MongoDb
Overview
prometheus-net.Contrib.MongoDb
is a C# library that provides client-side Prometheus instrumentation for MongoDB operations (instrumenting MongoDB C# Driver)
It captures various metrics related to MongoDB commands, errors, and performance, and exports them to Prometheus for monitoring and alerting.
The Why
Why create another metrics library for MongoDB when there's already mongodb_exporter?
It is true that mongodb_exporter
is a great tool for monitoring MongoDB, but it is a server-side tool that requires a separate process to run, possibly docker or other mode of deployment.
On top of that, it "actively" gathers information by polling MongoDB while this exporter will do it "passively" by instrumenting the MongoDB C# Driver, without the need to run a separate process.
Note: This library is still in development and more metrics will be added. A grafana dashboard definition is also in-progress 😃
Metrics Exposed
Command Duration (mongodb_client_command_duration
)
Histogram metric that measures the duration of MongoDB commands in seconds.
- Labels:
command_type
,status
,target_collection
,target_db
Open Cursors Count (mongodb_client_open_cursors_count
)
Gauge metric that tracks the number of open cursors.
- Labels:
target_collection
,target_db
Open Cursors Duration (mongodb_client_open_cursors_duration
)
Histogram metric that tracks the number of open cursors.
- Labels:
target_collection
,target_db
Open Cursor Document Count (mongodb_client_cursor_document_count
)
Summary metric that measures the document count fetched by a cursor (sum by operationId to get total per cursor).
- Labels:
target_collection
,target_db
Note: In MongoDB, a single operation can be broken into multiple operations that can be grouped by
operationId
(for example find → getMore that fetch query results in "pages", multiple bulkWrites, etc)
Command Errors (mongodb_client_command_errors_total
)
Counter metric that counts the total number of MongoDB command errors.
- Labels:
command_type
,error_type
,target_collection
,target_db
Command Request Size (mongodb_client_command_request_size
)
Histogram metric that measures the size of MongoDB command request in bytes.
- Labels:
command_type
,target_collection
,target_db
Command Response Size (mongodb_client_command_response_size
)
Histogram metric that measures the size of MongoDB command response in bytes.
- Labels:
command_type
,target_collection
,target_db
Connection Creation Rate (mongodb_client_connection_creation_rate
)
Counter metric that captures the rate at which new MongoDB connections are created.
- Labels:
cluster_id
,end_point
Connection Duration (mongodb_client_connection_duration
)
Histogram metric that measures the time it takes to close a MongoDB connection, in seconds.
- Labels:
cluster_id
,end_point
Query Filter Size (mongodb_client_query_filter_size
)
Histogram metric that tracks the size of MongoDB query filters.
- Labels:
query_type
,target_collection
,target_db
Note: This metric tries to capture the complexity of the filters being used in MongoDB queries. It recursively counts the number of clauses and items in the filters, which could be a useful metric for understanding query performance. Note that the performance in this case also depends on any indexes or their lack in the collection.
Query Count (mongodb_client_query_count
)
Counter metric that measures the number of "find" and "aggregate" MongoDB queries.
- Labels:
query_type
,target_collection
,target_db
Performance Considerations and Overhead
Instrumenting your MongoDB client does come with some level of performance overhead. Below are some factors to consider:
Memory Usage
The library maintains in-memory metrics related to MongoDB commands, connections, and cursors, among other things. Expect a marginal increase in memory usage.
CPU Load
The library hooks into various events in the MongoDB driver. Handling these events to generate metrics can cause a slight increase in CPU usage. However, this is generally negligible in a well-optimized application.
Database Latency
The library instruments driver-side events and thus there should not be increase in MongoDb command latency.
Metrics Storage and Export
Storing and exporting the metrics to Prometheus will also add some overhead. Make sure your Prometheus instance is capable of handling the load, and consider adjusting the scrape intervals if necessary.
Metric Cardinality
Metrics with high cardinality can cause increased memory and CPU usage, both on the client and the Prometheus server. The library uses labels like target_collection and target_db which, when dealing with many unique collections or databases, could lead to high cardinality.
Example:
If you have 10,000 collections and 5,000 databases, a metric with both these labels could potentially generate 50,000,000 (10,000 x 5,000) unique time series data points. This can significantly impact the performance and resources of your monitoring infrastructure.
Recommendations
- If you are running a high-throughput service, consider running some benchmarks to measure the exact overhead introduced by this library.
- Be mindful of the size of your collections and your the number of your databases when using this library.
Usage Example
Here's a simple example to instrument your MongoDB client:
using MongoDB.Driver;
var settings = MongoClientSettings.FromConnectionString("your_connection_string_here");
settings = settings.InstrumentForPrometheus();
var client = new MongoClient(settings);
Installation
This library is available as a NuGet package. To install, run:
Install-Package prometheus-net.Contrib.MongoDb
Contributing
If you'd like to contribute, please fork the repository and use a feature branch. Pull requests are warmly welcome.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- MongoDB.Driver (>= 2.19.0)
- prometheus-net (>= 8.0.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
3.0.9 | 220 | 9/29/2023 |
3.0.2 | 129 | 9/28/2023 |
3.0.0 | 131 | 9/28/2023 |
2.0.6 | 135 | 9/28/2023 |
2.0.4 | 132 | 9/27/2023 |
2.0.2 | 133 | 9/27/2023 |
2.0.0 | 138 | 9/27/2023 |
1.0.0 | 138 | 9/27/2023 |
0.8.6 | 151 | 9/27/2023 |
0.8.4 | 123 | 9/27/2023 |
0.8.2 | 145 | 9/26/2023 |
0.8.0 | 106 | 9/26/2023 |
0.7.10 | 155 | 9/26/2023 |
0.7.8 | 122 | 9/26/2023 |
0.7.6 | 140 | 9/26/2023 |
0.7.4 | 126 | 9/26/2023 |
0.7.2 | 125 | 9/26/2023 |
0.7.0 | 121 | 9/26/2023 |
0.6.0 | 136 | 9/25/2023 |
0.5.5 | 138 | 9/25/2023 |
0.5.0 | 134 | 9/24/2023 |
0.3.1 | 130 | 9/23/2023 |
0.2.6 | 131 | 9/23/2023 |
Changes since version v3.0.0.0
:bug: Bug Fixes:
- [`d997cb6`](https://github.com/myarichuk/prometheus-net.Contrib.MongoDb/commit/d997cb6b3e87ac6fbfe960bbd1be3cdd8ccfd071) - do not scan dynamic assemblies for metric provider implementations (closes [#42](https://github.com/myarichuk/prometheus-net.Contrib.MongoDb/pull/42)) *(commit by [@myarichuk](https://github.com/myarichuk))*
:recycle: Refactors:
- [`1e0b40a`](https://github.com/myarichuk/prometheus-net.Contrib.MongoDb/commit/1e0b40a3304b894b8ee86da8409526d7606ea40e) - rename `IMetricProvider` to `IMongoDbClientMetricProvider` and make it public - preparation work to allow users defining custom client-side metrics *(commit by [@myarichuk](https://github.com/myarichuk))*