kairosdb Rest API

今天和大家分享一下有關通過Rest API方式操作kairosdb server的相關內容,這是學習kairosdb入門很關鍵的部分,希望大家可以認真學習,要學習這部分內容需要我們做好之前環境搭建的工作。我的kairosdb server的http url的地址是“http://10.20.0.10:9090”,後面將通過這個連接來操作kairosdb。

KairosDB REST API提供了對一系列已存在的指標名、標記名和值、存儲指標數據點和查詢指標數據點的操作。

可以通過制定的指標名稱和時間範圍來查詢數據點,並可以任選一個或多個標記。查詢可以對數據進行處理操作,如聚合,平均值,最小值和最大值的計算。

所有的POST值和返回信息都以JSON格式表示。

在這裏我用java代碼來進行演示,熟悉java的同學應該很容易看懂

列出所有指標名

方法:GET

地址:http://[host]:[port]/api/v1/metricnames

body格式:None

package kairosdb.metric.com;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
public class getMetricNames {

	public getMetricNames() {
		// 定義httpClient的實例
		String url="http://10.20.0.10:9090/api/v1/metricnames";
		HttpClient httpclient = new HttpClient();
		GetMethod method=new GetMethod(url);
		httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(2000);
		try {
			int statusCode=httpclient.executeMethod(method);
			if(statusCode==HttpStatus.SC_OK){
				String body=method.getResponseBodyAsString();
				System.out.println("Content is:");
				System.out.println(body);
			}
			else{
				System.out.println("Something is error!");
			}
		} catch (HttpException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}

	/**
	 * 類描述:
	 * 
	 * @author: blank
	 * @date: 日期:2016-5-7 時間:上午10:46:28
	 * @param args
	 * @version 1.0
	 */
	public static void main(String[] args) {
         new getMetricNames();
	}

}
結果:Content is:
{"results":["kairosdb.datastore.query_time","kairosdb.protocol.telnet_request_count","kairosdb.http.ingest_count","kairosdb.datastore.query_row_count","kairosdb.http.ingest_time","kairosdb.protocol.http_request_count","kairosdb.jvm.thread_count","kairosdb.jvm.total_memory","kairosdb.jvm.max_memory","kairosdb.http.request_time","kairosdb.jvm.free_memory","kairosdb.datastore.query_sample_size","kairosdb.datastore.query_collisions","kairosdb.http.query_time","kairosdb.metric_counters","proc.loadavg.1m"]}


列出所有標記名

方法:GET

地址:http://[host]:[port]/api/v1/tagnames

body格式:None

package kairosdb.tag.com;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;

public class getTagNames {

	public getTagNames() {
		String url="http://10.20.0.10:9090/api/v1/tagnames";
		//初始化HttpClient
		HttpClient httpclient=new HttpClient();
		GetMethod method=new GetMethod(url);
		try {
			int statusCode=httpclient.executeMethod(method);
			if(statusCode==HttpStatus.SC_OK){
				String body=method.getResponseBodyAsString();
				System.out.println("Content is:");
				System.out.println(body);
			}else{
				System.out.println("Something is error!");
			}
		} catch (HttpException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	/**
	 *類描述:
	 *@author: blank
	 *@date: 日期:2016-5-7 時間:下午12:15:11
	 *@param args
	 *@version 1.0
	 */
	public static void main(String[] args) {
		new getTagNames();

	}

}

列出所有標記值

方法:GET

地址:http://[host]:[port]/api/v1/tagvalues

body格式:None

package kairosdb.tag.com;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;

public class getTagValues {

	public getTagValues() {
		String url = "http://10.20.0.10:9090/api/v1/tagvalues";
		HttpClient httpclient = new HttpClient();
		GetMethod method = new GetMethod(url);
		try {
			int statusCode = httpclient.executeMethod(method);
			if (statusCode == HttpStatus.SC_OK) {
				String body = method.getResponseBodyAsString();
				System.out.println("Content is:");
				System.out.println(body);
			} else {
				System.out.println("Something is error!");
			}
		} catch (HttpException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 類描述:
	 * 
	 * @author: blank
	 * @date: 日期:2016-5-7 時間:下午12:26:30
	 * @param args
	 * @version 1.0
	 */
	public static void main(String[] args) {
		new getTagValues();
	}

}


查詢Metric的Datapoint

方法:post

地址:http://[host]:[port]/api/v1/tagvalues

body格式:

{
  "metrics": [
    {
      "tags": {
        "host": [
          "kairosdb"
        ]
      },
      "name": "kairosdb.datastore.query_collisions",
      "aggregators": [
        {
          "name": "sum",
          "align_sampling": true,
          "sampling": {
            "value": "1",
            "unit": "milliseconds"
          }
        }
      ]
    }
  ],
  "cache_time": 0,
  "start_relative": {
    "value": "5",
    "unit": "minutes"
  }
}

代碼:

package kairosdb.metric.com;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import net.sf.json.JSONObject;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;

public class queryMetricByPost {

	public queryMetricByPost() {
		String url = "http://10.20.0.10:9090/api/v1/datapoints/query";
		HttpClient httpclient = new HttpClient();
		PostMethod method = new PostMethod(url);
		//將構造的json對象轉化爲字符串
		String transJson = getJSONObject().toString();
		System.out.println("Query is:");
		System.out.println(transJson);
		RequestEntity se;
		try {
			//構造一個查詢的實體
			se = new StringRequestEntity(transJson, "application/json", "UTF-8");
			//設置請求實體
			method.setRequestEntity(se);
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}

		try {
			//執行post請求
			int statusCode = httpclient.executeMethod(method);
			if (statusCode == HttpStatus.SC_OK) {
				//獲取到結果
				String body = method.getResponseBodyAsString();
				System.out.println("Content is:");
				System.out.println(body);
			} else {
				System.out.println("Something is error!");
			}
		} catch (HttpException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public class metrics {
		public tags tags;

		public tags getTags(){
			return this.tags;
		}
		public void setTags(tags tags) {
			this.tags = tags;
		}

		public String name;
        public String getName(){
        	return this.name;
        }
		public void setName(String name) {
			this.name = name;
		}

		public aggregators[] aggregators;
        public  aggregators[] getAggregators(){
        	return this.aggregators;
        }
		public void setAggregators(aggregators[] aggregators) {
			this.aggregators = aggregators;
		}
	}

	public class kairosdb {
		public metrics[] metrics;
        public metrics[] getMetrics(){
        	return this.metrics;
        }
		public void setMetrics(metrics[] metrics) {
			this.metrics = metrics;
		}

		public int cache_time;
        public int getCache_time(){
        	return this.cache_time;
        }
		public void setCache_time(int cache_time) {
			this.cache_time = cache_time;
		}

		public start_relative start_relative;
        public start_relative getStart_relative(){
        	return this.start_relative;
        }
		public void setStart_relative(start_relative start_relative) {
			this.start_relative = start_relative;
		}

	}

	public class start_relative {
		public String value;
        public String getValue(){
        	return this.value;
        }
		public void setValue(String value) {
			this.value = value;
		}

		public String unit;
        public String getUnit(){
        	return this.unit;
        }
		public void setUnit(String unit) {
			this.unit = unit;
		}
	}

	public class tags {
		public String[] host;
        public String[] getHost(){
        	return this.host;
        }
		public void setHost(String[] host) {
			this.host = host;
		}
	}

	public class sampling {
		public String value;
		public String unit;

		public String getValue(){
			return this.value;
		}
		public void setValue(String value) {
			this.value = value;
		}

		public String getUnit(){
			return this.unit;
		}
		public void setUnit(String unit) {
			this.unit = unit;
		}
	}

	public class aggregators {
		public String name;
        public String getName(){
        	return this.name;
        }
		public void setName(String name) {
			this.name = name;
		}

		public boolean align_sampling;
        public boolean getAlign_sampling(){
        	return this.align_sampling;
        }
		public void setAlign_sampling(boolean align_sampling) {
			this.align_sampling = align_sampling;
		}

		public sampling sampling;
        public sampling getSampling(){
        	return this.sampling;
        }
		public void setSampling(sampling sampling) {
			this.sampling = sampling;
		}
	}

	public kairosdb getkairosdb() {
		start_relative start_relative = new start_relative();
		start_relative.setValue("5");
		start_relative.setUnit("minutes");

		sampling sampling = new sampling();
		sampling.setValue("1");
		sampling.setUnit("milliseconds");

		aggregators aggregator = new aggregators();
		aggregator.setSampling(sampling);
		aggregator.setAlign_sampling(true);
		aggregator.setName("sum");

		tags tags = new tags();
		String[] host = { "kairosdb" };
		tags.setHost(host);

		metrics metric = new metrics();
		metric.setTags(tags);
		aggregators[] aggregators = new aggregators[] { aggregator };
		metric.setAggregators(aggregators);
		metric.setName("kairosdb.http.query_time");

		kairosdb kairosdb = new kairosdb();
		kairosdb.setCache_time(0);
		metrics[] metrics = new metrics[] { metric };
		kairosdb.setMetrics(metrics);
		kairosdb.setStart_relative(start_relative);
		return kairosdb;
	}

	public JSONObject getJSONObject() {
		//構造一個查詢的json對象
		kairosdb kairosdb = getkairosdb();
		JSONObject object = JSONObject.fromObject(kairosdb);
		return object;
	}
	/**
	 * 類描述:
	 * 
	 * @author: blank
	 * @date: 日期:2016-5-7 時間:下午12:43:21
	 * @param args
	 * @version 1.0
	 */
	public static void main(String[] args) {
		new queryMetricByPost();
	}

}
結果:Content is:
{"queries":[{"sample_size":0,"results":[{"name":"kairosdb.http.query_time","group_by":[{"name":"type","type":"number"}],"tags":{"host":["kairosdb"],"metric_name":["kairosdb.datastore.query_collisions","kairosdb.datastore.query_time","kairosdb.http.query_time","kairosdb.http.request_time","kairosdb.jvm.max_memory","kairosdb.jvm.thread_count","kairosdb.jvm.total_memory","kairosdb.protocol.telnet_request_count","proc.loadavg.1m"],"query_index":["1","2"],"request":["/datapoints/query"]},"values":[]}]}]}


以上便是常見的操作。但是你會發現在我們query數據的時候,要傳遞很複雜的Json字符串作爲條件,顯然這種方式比較複雜,別擔心下一章給大家介紹一個開源庫(kairosdb client),編寫非常簡單。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章