Custom Postgres metrics in Datadog

Instrumenting applications is something we are used to at Bithaus. Having the code reporting itself delivers great information, and every person involved in the system from developers, operations and managers appreciate it.

But you cannot always change the code to get metrics, or not as fast as you would like to.

An excellent way to gather business metric of your application, is to look in your tables in the database. Continue on reading for step-by-step on how to create a custom metric based on a SQL query, so we can display it on a dashboard and create monitors to check it’s value.

Your table, your metrics

In our case, we needed to measure the performance and progress of an ETL process in a data migration project. We had a statistics table that looks something like this:

example_database=> \d source_stats 
                   View "public.source_stats"
        Column         |              Type              | Modifiers 
 source_id             | integer                        | 
 data_type_id          | smallint                       | 
 creation_ts           | timestamp without time zone    | 
 update_ts             | timestamp without time zone    | 
 last_inserted_data_ts | timestamp(0) without time zone | 
 entry_count           | bigint                         | 

Rows here are inserted/updated when the ETL works on a “source” identified by “source_id”. So we have when the ETL started working on a source, when was the last time the stats were updated and the total entry count processed.

Based on this information, we created a view called etl_stats that summarises the overall process. on a regular basis, our “source_stats” table is updated allowing the view to show real-time status.

 count | avgtime | avg_entry_count 
   156 |      50 |         1092847

Configuring the Datadog Postgresql collector

If you haven’t already enabled the PostgreSQL extension of Datadog agent, you can do so HERE.

Go to the Datadog extensions configuration directory, which is /etc/dd-agent/conf.d for Ubuntu installations, and edit the postgres.yaml file.


  - host: localhost
    port: 5432
    username: datadog
    password: YOUR_PASSWORD
    ssl: True
      - psql:example_instance

    dbname: example_database
    - # ETL Stats
      descriptors: []
        count: [my.etl.sources_finished, GAUGE]
        avgtime: [my.etl.avg_process_time, GAUGE]
        avg_entry_count: [my.etl.avg_entry_count, GAUGE]
      query: SELECT %s from etl_stats;
      relation: false

This is the most simple setup. The logic is that every metric defined in the “metric” property correspond to a table column in the “query” statement. In this case, our table has 3 columns count, avgtime, avg_entry_count that are mapped to 3 metrics. Internally, the agent builds the query based on the metrics on runtime, as you can see in the collector.log when debbuging:

2016-02-22 13:13:51 CLT | DEBUG | dd.collector | checks.postgres( | Running query: SELECT count, avgtime, avg_entry_count from etl_stats;

The column – metric mapping. This is the magic right here!


In our example we created a metric “my.etl.sources_finished” type “gauge” that reports the value of the column “count” of our summary table.

       count : [my.etl.sources_finished, GAUGE]

Define as many metrics as you need depending on your query. Datadog collector will run these when collecting standard postgres metrics. If anything goes wrong you should check the collector log – Ubuntu: /var/log/datadog/collector.log.

Restart the agent and that’s it – Ubuntu: service datadog-agent restart.

You may check your configuration using service datadog-agent checkconfig and check the collection status with service datadog-agent info.

Collector (v 5.6.1)

  Status date: 2016-02-22 18:21:10 (7s ago)
  Pid: 17902
  Platform: Linux-3.2.0-23-generic-x86_64-with-debian-wheezy-sid
  Python Version: 2.7.10
  Logs: , /var/log/datadog/collector.log, syslog:/dev/log

    NTP offset: 0.0053 s
    System UTC time: 2016-02-22 21:21:18.485238
    conf.d: /etc/dd-agent/conf.d
    checks.d: /opt/datadog-agent/agent/checks.d
    socket-hostname: ubuntu-vm
      - Collected 0 metrics, 0 events & 1 service check
      - instance #0 [OK]
      - Collected 48 metrics, 0 events & 1 service check
      - instance #0 [OK]
      - Collected 45 metrics, 0 events & 2 service checks


Using your custom metric on Datadog

Go into your Datadog account to the Metric > Explorer. In the Graph input type the name of the metric that you defined in postgres.yaml.


If everything went OK, magic!


And then you can go all crazy with dashboards B-)




Datadog helps teams across different areas in an organisation to have insight and control over the IT products and services that they are involved. Metrics & monitoring over SO + databases + services + apps + business; all in one TV screen.

Bithaus Software – Datadog partner from Chile.



Publicado por jmakuc

Coder for life, solution architect, founder of Bithaus Software and Datadog partner for Chile. Come in, let's have an expresso!

Deja un comentario

A %d blogueros les gusta esto: