Forward DogStatsD Metrics to Prometheus

Sat 17 June 2017

tl;dr: StatsD doesn't have metric labels, DogStatsD does.

This is a follow up post after Instrumenting Django with Prometheus and StatsD.


You got Prometheus up and running and eager to start instrumenting your Django application. Don't be hasty and read Prometheus Best Practices.

Let's say our application has to use a Python library to request weather forecast. Sometimes Weather API server doesn't work as expected and we find HTTP 500 status codes in our application logs. Out of curiosity we want to know how often that happens. What if we already have to look for another forecast provider?

First idea could be using a counter "weatherapi_responses_500_total". From the Prometheus docs:

When reporting failures, you should generally have some other metric representing the total number of attempts. This makes the failure ratio easy to calculate.

Alright, then we need to count "HTTP 200 OK" API responses as well "weatherapi_responses_200_total". But what about other HTTP status codes? Shall we create metrics for each of them?

When you have multiple metrics that you want to add/average/sum, they should usually be one metric with labels rather than multiple metrics.

As this is exactly our case, we should use Prometheus labels. Therefore our metric name should be "weatherapi_responses_total" with a "code" label for the HTTP response code.

Depending on a scenario, we might have multiple API clients in our application. For example, we may generalize metric to "api_responses_total" with the following labels "code=200", "service=weather".

Although we should keep it sane and not overuse labels.

StatsD by Datadog

In the previous post we used StatsD with statsd_exporter to forward metrics to Prometheus server. StatsD protocol doesn't have a notion of labels, but Datadog's fork has introduced tags. Moreover statsd_exporter can convert them into Prometheus labels.

Let's take it step by step. Firstly, we need Datadog Python client.

$ pip install datadog==0.16.0

Secondly, we should increment "weatherapi.responses.total" counter. For example:

import weather
from datadog import statsd


def request_weather_forecast(location):
    try:
        forecast = weather.Forecast.retrieve(location)
    except weather.APIError as exc:
        statsd.increment('weatherapi.responses.total', tags=[
            'code:{}'.format(exc.http_status_code),
        ])
        raise

    statsd.increment('weatherapi.responses.total', tags=[
        'code:200',
    ])
    return forecast

Well, since I made up the weather library, we can just run a Python script:

from datadog import statsd
statsd.increment('weatherapi.responses.total', tags=['code:200'])

And finally, we should run statsd_exporter with disabled "-statsd.add-suffix" flag which adds the metric type (counter/gauge/timer) as suffix to the generated Prometheus metric.

$ statsd_exporter \
    -statsd.listen-address=:8125 \
    -statsd.add-suffix=false

The statsd_exporter should expose our metric at http://localhost:9102/metrics.

# HELP weatherapi_responses_total Metric autogenerated by statsd_exporter.
# TYPE weatherapi_responses_total counter
weatherapi_responses_total{code="200"} 1

I hope this helps. Cheers!

Category: Infrastructure Tagged: prometheus monitoring statsd dogstatsd datadog

comments


API based on Flask

Mon 09 December 2013

Here I want to consider implementation of API best practices which usually don't follow Fielding's REST strictly. Example Flask project is on GitHub.

API Versioning

Interfaces are changed hence versioning is mandatory in order to not annoy your users. You might need to add new resource or field to particular …

Category: Python Tagged: python flask api

comments

Read More

Preparation to Python Interview

Fri 02 November 2012

I decided to collect a little more information and experience during preparation to Python developer interview. These are some information and links which seemed important to me. Maybe it will be helpful.

How does it usually go?

What kind of projects did you participate in?

What did you do at …

Category: Python Tagged: python interview

comments

Read More

Стартап fangid.com

Sat 13 October 2012

В середине июля 2012 г. команда стартапа fangid.com приступила к воплощению идеи социальной концертной платформы на севере Таиланда. Я занимался подготовительными работами (соглашениями по разработке, первоначальной подготовкой репозитория, например, продумыванием структуры, организацией тестов, разделением настроек), принимал участие в выработке требований к системе и проектировании архитектуры. При конструировании системы моими …

Category: Portfolio Tagged: python django startup thailand

comments

Read More

Портфолио 2007–2011

Fri 12 October 2012

Не стал перечислять те сайты, которые за давностью лет были переделаны либо перестали существовать. В основном backend основан на cms myscon, которая была переписана мною несколько раз.

2011

  • электронный архив ежемесячного литературно-публицистического журнала «Агидель» на Django. Предполагается, что ресурс будет содержать архив журналов с 1923 года. Для удобной навигации сделал …

Category: Portfolio Tagged: php codeigniter cms myscon python django

comments

Read More

Django TODO: тестирование во время конструирования

Fri 29 June 2012

Тестирование, выполняемое разработчиками -- один из важнейших элементов полной стратегии тестирования.

Тестирование может указать только на отдельные дефектные области программы -- оно не сделает программу удобнее в использовании, более быстрой, компактной, удобочитаемой или расширяемой.

Цель тестирования противоположна целям других этапов разработки. Его целью является нахождение ошибок. Успешным считается тест, нарушающий работу ПО …

Category: Python Tagged: python django django-todo testing

comments

Read More

Django TODO: конструирование системы

Fri 29 June 2012

При работе над проектом конструирование включает другие процессы, в том числе проектирование. Формальная архитектура дает ответы только на вопросы системного уровня, при этом значительная часть проектирования может быть намеренно оставлена на этап конструирования. Проектирование -- это "постепенный" процесс. Проекты приложений не возникают в умах разработчиков сразу в готовом виде. Они развиваются …

Category: Python Tagged: python django django-todo construction

comments

Read More

Django TODO: проектирование архитектуры системы

Fri 29 June 2012

Следующим этапом разработки системы является проектирование архитектуры.

Архитектура должна быть продуманным концептуальным целым. Главный тезис самой популярной книги по разработке ПО "Мифический человеко-месяц" гласит, что основной проблемой, характерной для крупных систем, является поддержание их концептуальной целостности. Хорошая архитектура должна соответствовать проблеме [1].

Разделение системы на подсистемы на уровне архитектуры, позволяет …

Category: Python Tagged: python django django-todo architecture

comments

Read More

Django TODO: выработка требований к системе

Fri 29 June 2012

После прочтения Макконелла захотелось спроецировать его советы на Django. Для этого я взял за основу разработку системы Django TODO. Итак, первый этап -- выработка требований к системе.

Требования подробно описывают, что должна делать система. Внимание к требованиям помогает свести к минимуму изменения системы после начала разработки. Явные требования помогают гарантировать, что …

Category: Python Tagged: python django django-todo requirements

comments

Read More

Соглашения по разработке на Python/Django

Fri 29 June 2012

Во время разработки я часто сверяюсь с известными мне соглашениями, стараюсь следовать рекомендациям. Цитировать их не имеет смысла -- лучше приведу ссылки.

PEP 8 -- Style Guide for Python Code.

Code Like a Pythonista: Idiomatic Python. В нем я нашел ответы на вопросы форматирования длинных строк:

expended_time = (self.finish_date() - self.start_date
                 + datetime …

Category: Python Tagged: python django best practices

comments

Read More

Разделение настроек в Django

Fri 29 June 2012

В Django wiki собраны различные способы разделения настроек. Мне нравится вариант, описанный в блоге Senko Rašić:

settings/
├── __init__.py
├── base.py
├── development.py
├── local.py
└── production.py

base.py содержит общие настройки для development.py и production.py, например:

ADMINS = ()
MANAGERS = ADMINS

TIME_ZONE = 'Asia/Yekaterinburg'
# ...

production.py содержит настройки для …

Category: Python Tagged: python django settings

comments

Read More

Краткий обзор инфраструктуры для разработки reusable Django приложений

Wed 13 June 2012

Начиная впервые разрабатывать веб-приложения на новом фреймворке программист зачастую сталкивается с некоторыми трудностями. При разработке отчуждаемых веб-приложений на Django к этим проблемам необходимо отнести организацию файлов в проекте, обнаружение тестов, вопросы пакетирования приложений и организации автоматизированного тестирования. В данной статье приведены пути решения этих проблем.

Важно знать различия между двумя …

Category: Python Tagged: python django infrastructure

comments

Read More

Вычислительные методы одномерной оптимизации

Wed 06 October 2010

На третьем курсе по предмету методы оптимизации делали лабораторную работу на тему «Вычислительные методы одномерной оптимизации». Задача заключалась в поиске безусловного минимума функции f(x) = pow(x, 3) – x + pow(e, -x) на начальном интервале [0, 1] с точностью 0.00001.

Вычисления производились через:

  • пассивный метод;
  • равномерные блочные методы;
  • метод …

Category: Misc Tagged: php mathematical optimization

comments

Read More

Определение нажатия комбинации клавиш средствами BIOS на ассемблере

Thu 03 December 2009

По учебе понадобилось написать программу на ассемблере, которая должна распознать нажатие «горячей» комбинации клавиш LeftCtrl+RightShift+F3 и реагировать на него звуковым сигналом. Информации/примеров по этой теме маловато, по этому решил опубликовать свою программку.

masm
.model small
.stack 256
.data
    Msg_about db 'Распознать нажатие «горячей» комбинации клавиш', 0Ah, 0Dh …

Category: Misc Tagged: assembler

comments

Read More

Моделирование одноканальной СМО с отказами

Sat 30 May 2009

Дана одноканальная система массового обслуживания с отказами. В нее поступают заявки через промежуток времени n, где n – случайная величина, подчиненная равномерному закону распределения. Время обслуживания заявки системой m также является случайной величиной с показательным законом распределения. Если к моменту прихода заявки канал занят, заявка покидает систему необслуженной.

Изначально код был …

Category: Misc Tagged: python modeling single-channel queue

comments

Read More