Collect MongoDB Custom Metrics

Overview

To collect custom metrics with the MongoDB integration, use the custom_queries option in the conf.d/mongo.d/conf.yaml file at the root of your Agent’s configuration directory. See the sample mongo.d/conf.yaml for more details.

Configuration

custom_queries has the following options:

  • metric_prefix: Each metric starts with the chosen prefix.
  • query: This is the Mongo runCommand query to execute as a JSON object. Note: The Agent only supports count, find, and aggregates queries.
  • database: This is the MongoDB database to collect metrics from.
  • fields: Ignored for count queries. This is a list representing each field with no specific order. Ignores unspecified and missing fields. There are three required pieces of data for each fields:
    • field_name: This is the name of the field from which to fetch the data.
    • name: This is the suffix to append to the metric_prefix to form the full metric name. If type is tag, this column is treated as a tag and applied to every metric collected by this particular query.
    • type: This is the submission method (gauge, count, rate, and more). This can also be set to tag to tag each metric in the row with the name and value of the item in this column. You can use the count type to perform aggregation for queries that return multiple rows with the same or no tags.
  • tags: A list of tags to apply to each metric (as specified above).
  • count_type: For count queries only, this is the submission method (gauge, count, rate, and more) of the count result. Ignored for non-count queries.

Examples

For the examples below, the following Mongo collection user_collection is used:

{ name: "foo", id: 12345, active: true, age:45, is_admin: true}
{ name: "bar", id: 67890, active: false, age:25, is_admin: true}
{ name: "foobar", id: 16273, active: true, age:35, is_admin: false}

Choose the type of query you would like to see an example for:

To monitor how many users are active at a given time, your Mongo count command would be:

db.runCommand( {count: user_collection, query: {active:true}})

Which would correspond to the following custom_queries YAML configuration inside your mongo.d/conf.yaml file:

custom_queries:
  - metric_prefix: mongo.users
    query: {"count": "user_collection", "query": {"active":"true"}}
    count_type: gauge
    tags:
      - user:active

This would emit one gauge metric mongo.users with one tag: user:active.

Note: The metric type defined is gauge.

To monitor the age per user, your Mongo find command would be:

db.runCommand( {find: user_collection, filter: {active:true} )

Which would correspond to the following custom_queries YAML configuration inside your mongo.d/conf.yaml file:

custom_queries:
  - metric_prefix: mongo.example2
    query: {"find": "user_collection", "filter": {"active":"true"}}
    fields:
      - field_name: name
        name: name
        type: tag
      - field_name: age
        name: user.age
        type: gauge

This would emit one gauge metric mongo.example2.user.age with two tags: name:foo and name:foobar

Note: The metric type defined is gauge.

To monitor the average age for an admin and a non-admin user, your Mongo aggregate command would be:

db.runCommand(
              {
                'aggregate': "user_collection",
                'pipeline': [
                  {"$match": {"active": "true"}},
                  {"$group": {"_id": "$is_admin", "age_avg": {"$avg": "$age"}}}
                ],
                'cursor': {}
              }
            )

Which would correspond to the following custom_queries YAML configuration inside your mongo.d/conf.yaml file:

custom_queries:
  - metric_prefix: mongo.example3
    query: {"aggregate": "user_collection","pipeline": [{"$match": {"active": "true"}},{"$group": {"_id": "$is_admin", "age_avg": {"$avg": "$age"}}}],"cursor": {}}
    fields:
      - field_name: age_avg
        name: user.age
        type: gauge
      - field_name: _id
        name: is_admin
        type: tag
    tags:
      - test:mongodb

This would emit one gauge metric mongo.example3.user.age with two tags: is_admin:true and is_admin:false representing the average age of users for each tags.

Note: After updating the Mongo YAML file, restart the Datadog Agent.

Validation

To verify the result, search for the metrics using the Metrics Explorer.

Debugging

Run the Agent’s status subcommand and look for mongo under the Checks section. Additionally, the Agent’s logs may provide useful information.

Further Reading

Additional helpful documentation, links, and articles: