#include "fieldstat_internal.h" #define HTTPSERVER_IMPL #include "httpserver.h" struct prometheus_endpoint_instance g_prometheus_endpoint_instance = { 9273, NULL, 0, 0, 0, NULL, 0, NULL, REALLOC_SCALE_SIZE, }; static char* str_unescape(char* s, char *d, int d_len) { int i=0,j=0; int len=strlen(s); for(i=0; i=0 && ret < instance_cnt output sepecify fieldstat instance output: http://127.0.0.1:9273/sapp content * ret = instance_cnt output all fieldstat instance output: http://127.0.0.1:9273/metrics content */ static int prometheus_get_fs_instance_id(struct prometheus_endpoint_instance *global_prometheus_output, char *uri, int uri_len) { int i = 0; char instance_name_url[INSTANCE_NAME_LEN + 1] = {0}; int instance_name_url_len = 0; if(uri_len == (int)strlen(global_prometheus_output->url_path) // metrics && 0 == memcmp(uri, global_prometheus_output->url_path, strlen(global_prometheus_output->url_path))) { return global_prometheus_output->fs_instance_cnt; } for(i = 0; i < global_prometheus_output->fs_instance_cnt; i++) // A perticular instance { memset(instance_name_url, 0, sizeof(instance_name_url)); instance_name_url_len = snprintf(instance_name_url, sizeof(instance_name_url),"/%s",global_prometheus_output->fs_instance[i]->name); if(uri_len == instance_name_url_len && 0 == memcmp( uri, instance_name_url, instance_name_url_len)) { return i; } } return -1; } static void prometheus_output_uri_list(struct prometheus_endpoint_instance *prometheus_output,struct http_request_s* request) { int i = 0; int payload_len = 0; char *payload = NULL; int used_len = 0; struct fieldstat_instance **fs_instance = NULL; struct http_response_s* response = NULL; fs_instance = prometheus_output->fs_instance; if(prometheus_output->fs_instance_cnt > 0) { payload_len = prometheus_output->fs_instance_cnt * 128; payload = (char *)calloc(payload_len, sizeof(char)); used_len += snprintf(payload + used_len, payload_len - used_len, "url_path:\n\t%s\n", prometheus_output->url_path); for(i = 0; i < prometheus_output->fs_instance_cnt; i++) { used_len += snprintf(payload + used_len, payload_len - used_len, "\t/%s\n", fs_instance[i]->name); } } else { payload = (char *)calloc(128, sizeof(char)); strncpy(payload, "Not Invaild instance\n", 128); } response = http_response_init(); http_response_status(response, 404); http_response_header(response, "Content-Type", "text/plain; charset=utf-8"); http_response_body(response, payload, strlen(payload)); http_respond(request, response); free(payload); payload=NULL; return; } static int prometheus_output_read_metric_tags(struct metric *metric, char *instance_name, char *tags_buf, unsigned int size) { int i = 0;//used_len = 0; char unescape[256] = {0}; int used_len = 0; used_len += snprintf(tags_buf + used_len, size - used_len, "app_name=\"%s\"", instance_name); if(metric->table) { used_len += snprintf(tags_buf + used_len, size - used_len, ",table_name=\"%s\",line_name=\"%s\"", metric->table->name, metric->field_name); } for(i = 0; i < (int)metric->n_tag; i++) { memset(unescape, 0, sizeof(unescape)); str_unescape(metric->tag_key[i], unescape, sizeof(unescape)); used_len += snprintf(tags_buf, size - used_len, ",%s=\"%s\"", unescape, metric->tag_value[i]); } return used_len; } static int prometheus_output_read_metric_name(struct metric *metric, char *instance_app_name, char *name_buf, unsigned int size) { char unescape[256] = {0}; int used_len = 0; if(metric->table) { str_unescape(metric->table->column_name[metric->table_column_id], unescape, sizeof(unescape)); } else { str_unescape(metric->field_name, unescape, sizeof(unescape)); } used_len += snprintf(name_buf, size - used_len, "%s_%s", instance_app_name, unescape); return used_len; } static int prometheus_output_histogram_and_summary(struct metric *metric, char *payload, int payload_len, char *instance_app_name, char *metric_name, char *metric_tags) { long long value=0; long long sum = 0; int i=0,used_len=0; struct hdr_iter iter; char *output_format = NULL; //struct histogram_t* h=&(p->histogram); struct histogram_t *h = &(metric->histogram); struct hdr_histogram* h_out=NULL, *h_tmp=NULL; int bin_num = metric->histogram.bins_num; double *bins = metric->histogram.bins; if(metric->field_type == FILED_TYPE_HISTOGRAM) { output_format = (char *)"%s_bucket{%s,le=\"%0.2f\"} %lld\n"; } if(metric->field_type == FIELD_TYPE_SUMMARY) { output_format = (char *)"%s{%s,quantile=\"%0.2f\"} %lld\n"; } hdr_init(h->lowest_trackable_value, h->highest_trackable_value, h->significant_figures, &(h_tmp)); hdr_add(h_tmp, h->accumulated); hdr_add(h_tmp, h->changing); h_out=h_tmp; for(i=0;ifield_type == FILED_TYPE_HISTOGRAM) { value = (long long)hdr_count_le_value(h_out, (long long)bins[i]); } if(metric->field_type == FIELD_TYPE_SUMMARY) { value=(long long)hdr_value_at_percentile(h_out, bins[i]); } used_len+=snprintf(payload+used_len, payload_len-used_len, output_format, metric_name, metric_tags, bins[i], value ); } used_len+=snprintf(payload+used_len, payload_len-used_len, "%s_count{%s} %lld\n", metric_name, metric_tags, (long long)h_out->total_count ); hdr_iter_recorded_init(&iter, h_out); while (hdr_iter_next(&iter)) { sum+=(long long)iter.value; } used_len+=snprintf(payload+used_len, payload_len-used_len, "%s_sum{%s} %lld\n", metric_name, metric_tags, sum ); hdr_close(h_tmp); h_tmp=NULL; return used_len; } // output format: {tag, mytag,