Skip to content

ruanbekker/datadog-mysql-profiler-metrics

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 

Repository files navigation

datadog-mysql-profiler-metrics

MySQL Table Level Metrics for Datadog in Python

About

Datadog does not provide MySQL Table Level metrics out of the box, so I used Python and Datadog's API to achieve getting table statistics into Datadog as a custom metric.

Requirements

You will need a datadog account, api/app keys, mysql server and the python packages

Datadog Keys:

Create API and APP keys:

Check out the API Documentation:

Python Packages:

$ pip install mysqlclient $ pip install datadog 

MySQL Sys Schema:

The sys schema objects can be used for typical tuning and diagnosis use cases:

mysql> select * from sys.`x$schema_table_statistics` where total_latency > 0\G *************************** 1. row *************************** table_schema: foo table_name: bar total_latency: 3730128452604 rows_fetched: 3929224 fetch_latency: 1998830290976 rows_inserted: 19967 insert_latency: 1731298161628 rows_updated: 0 update_latency: 0 rows_deleted: 0 delete_latency: 0 io_read_requests: 14 io_read: 972 io_read_latency: 51442220 io_write_requests: 43 io_write: 414182 io_write_latency: 1079346324 io_misc_requests: 76 io_misc_latency: 92505469736 

Datadog Timeseries API

The metrics end-point allows you to post time-series data that can be graphed on Datadog’s dashboards:

# Submit multiple metrics api.Metric.send([{ 'metric': 'my.series', 'points': 15 }, { 'metric': 'my1.series', 'points': 16 }]) 

Map MySQL to JSON

Map the returned data to json:

mysql_querydata = cursor.fetchall() json_data=[] for row_data in mysql_querydata: json_data.append(dict(zip(row_headers, row_data))) 

Preview the data:

>>> print(json_data) [{'rows_inserted': 19967, }, {'rows_updated': 0}] 

Map JSON to Datadog Metrics:

metrics = [] for each in payload: table_name = each['table_name'] for k in each.keys(): if type(each[k]) == str: pass else: metrics.append({ 'metric': 'mysql.custom_metric.{}.{}'.format(table_name, k), 'points': each[k], 'host': hostname, 'tags': tags }) 

preview data:

>>> print(metrics) [{'metric': 'mysql.custom_metric.foo.io_misc_requests', 'points': Decimal('93'), 'host': 'datadog-mysql', 'tags': ['mysql:performance_data']},..] 

Screenshots:

Metrics:

image

Dashboard:

image

About

MySQL Table Level Metrics for Datadog in Python

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages