0
0
Fork 0
mirror of https://github.com/netdata/netdata.git synced 2025-04-20 20:10:08 +00:00
netdata_netdata/backends/prometheus/remote_write/remote_write.cc
Vladimir Kobal 77781d033d Prometheus remote write backend ()
* Add Prometheus remote write backend prototype

* Fix autotools issues

* Send HTTP POST request

* Add parameters to HTTP header

* Discard HTTP responce 200

* Update CMake build configuration

* Fix Codacy issue

* Check for C++ binary

* Fix compilation without remote write backend

* Add options to the installer script

* Fix configure script warning

* Fix make dist

* Downgrade to ByteSize for better compatibility

* Integrate remote write more tightly into the existing backends code

* Cleanup

* Fix build error

* Parse host tags

* Fix Codacy issue

* Fix counters for buffered data

* Rename preprocessor symbol

* Better error handling

* Cleanup

* Update the documentation
2019-06-07 10:48:32 +02:00

117 lines
3 KiB
C++

// SPDX-License-Identifier: GPL-3.0-or-later
#include <snappy.h>
#include "remote_write.pb.h"
#include "remote_write.h"
using namespace prometheus;
google::protobuf::Arena arena;
WriteRequest *write_request;
void init_write_request() {
GOOGLE_PROTOBUF_VERIFY_VERSION;
write_request = google::protobuf::Arena::CreateMessage<WriteRequest>(&arena);
}
void clear_write_request() {
write_request->clear_timeseries();
}
void add_host_info(const char *name, const char *instance, const char *application, const char *version, const int64_t timestamp) {
TimeSeries *timeseries;
Sample *sample;
Label *label;
timeseries = write_request->add_timeseries();
label = timeseries->add_labels();
label->set_name("__name__");
label->set_value(name);
label = timeseries->add_labels();
label->set_name("instance");
label->set_value(instance);
if(application) {
label = timeseries->add_labels();
label->set_name("application");
label->set_value(application);
}
if(version) {
label = timeseries->add_labels();
label->set_name("version");
label->set_value(version);
}
sample = timeseries->add_samples();
sample->set_value(1);
sample->set_timestamp(timestamp);
}
// adds tag to the last created timeseries
void add_tag(char *tag, char *value) {
TimeSeries *timeseries;
Label *label;
timeseries = write_request->mutable_timeseries(write_request->timeseries_size() - 1);
label = timeseries->add_labels();
label->set_name(tag);
label->set_value(value);
}
void add_metric(const char *name, const char *chart, const char *family, const char *dimension, const char *instance, const double value, const int64_t timestamp) {
TimeSeries *timeseries;
Sample *sample;
Label *label;
timeseries = write_request->add_timeseries();
label = timeseries->add_labels();
label->set_name("__name__");
label->set_value(name);
label = timeseries->add_labels();
label->set_name("chart");
label->set_value(chart);
label = timeseries->add_labels();
label->set_name("family");
label->set_value(family);
if(dimension) {
label = timeseries->add_labels();
label->set_name("dimension");
label->set_value(dimension);
}
label = timeseries->add_labels();
label->set_name("instance");
label->set_value(instance);
sample = timeseries->add_samples();
sample->set_value(value);
sample->set_timestamp(timestamp);
}
size_t get_write_request_size(){
size_t size = (size_t)snappy::MaxCompressedLength(write_request->ByteSize());
return (size < INT_MAX)?size:0;
}
int pack_write_request(char *buffer, size_t *size) {
std::string uncompressed_write_request;
if(write_request->SerializeToString(&uncompressed_write_request) == false) return 1;
snappy::RawCompress(uncompressed_write_request.data(), uncompressed_write_request.size(), buffer, size);
return 0;
}
void protocol_buffers_shutdown() {
google::protobuf::ShutdownProtobufLibrary();
}