2b8052052d
This change adds a publisher to push metrics to Prometheus Pushgateway. Change-Id: I7d5f39f036714ac1e36d3297ad58dd8498908a53
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
#
|
|
# Copyright 2016 IBM
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from ceilometer.publisher import http
|
|
from ceilometer import sample
|
|
|
|
|
|
class PrometheusPublisher(http.HttpPublisher):
|
|
"""Publish metering data to Prometheus Pushgateway endpoint
|
|
|
|
This dispatcher inherits from all options of the http dispatcher.
|
|
|
|
To use this publisher for samples, add the following section to the
|
|
/etc/ceilometer/pipeline.yaml file or simply add it to an existing
|
|
pipeline::
|
|
|
|
- name: meter_file
|
|
meters:
|
|
- "*"
|
|
publishers:
|
|
- prometheus://mypushgateway/metrics/job/ceilometer
|
|
|
|
"""
|
|
|
|
HEADERS = {'Content-type': 'plain/text'}
|
|
|
|
def publish_samples(self, samples):
|
|
"""Send a metering message for publishing
|
|
|
|
:param samples: Samples from pipeline after transformation
|
|
"""
|
|
if not samples:
|
|
return
|
|
|
|
data = ""
|
|
doc_done = set()
|
|
for s in samples:
|
|
# NOTE(sileht): delta can't be converted into prometheus data
|
|
# format so don't set the metric type for it
|
|
metric_type = None
|
|
if s.type == sample.TYPE_CUMULATIVE:
|
|
metric_type = "counter"
|
|
elif s.type == sample.TYPE_GAUGE:
|
|
metric_type = "gauge"
|
|
|
|
if metric_type and s.name not in doc_done:
|
|
data += "# TYPE %s %s\n" % (s.name, metric_type)
|
|
doc_done.add(s.name)
|
|
|
|
# NOTE(sileht): prometheus pushgateway doesn't allow to push
|
|
# timestamp_ms
|
|
#
|
|
# timestamp_ms = (
|
|
# s.get_iso_timestamp().replace(tzinfo=None) -
|
|
# datetime.utcfromtimestamp(0)
|
|
# ).total_seconds() * 1000
|
|
# data += '%s{resource_id="%s"} %s %d\n' % (
|
|
# s.name, s.resource_id, s.volume, timestamp_ms)
|
|
|
|
data += '%s{resource_id="%s"} %s\n' % (
|
|
s.name, s.resource_id, s.volume)
|
|
self._do_post(data)
|
|
|
|
@staticmethod
|
|
def publish_events(events):
|
|
raise NotImplementedError
|