123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #-*- coding:utf-8 -*-
- # Copyright 2017 Xiaomi, Inc.
- #
- # 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.
- import json
- import re
- from flask import request, abort, g, render_template
- from rrd import app, config
- from rrd import corelib
- def get_api_endpoints(q, tags, page=1, limit=100):
- if not q and not tags:
- raise Exception("no query params given")
- h = {"Content-type": "application/json"}
- r = corelib.auth_requests("GET", config.API_ADDR + "/graph/endpoint?q=%s&limit=%d&page=%d&tags=%s" %(q, limit, page, tags), headers=h)
- if r.status_code != 200:
- raise Exception(r.text)
- j = sorted(r.json(), key=lambda x:x["endpoint"])
- return j
- @app.route("/")
- def index():
- q = request.args.get("q") or "."
- raw_tag = request.args.get("tags") or ""
- tags = ','.join(re.split('\s*,\s*', raw_tag))
- limit = int(request.args.get("limit") or 50)
- page = int(request.args.get("page") or 1)
- endpoint_objs = get_api_endpoints(q, tags, page, limit)
- return render_template("index.html", **locals())
- @app.route("/api/endpoints")
- def api_endpoints():
- ret = {
- "ok": False,
- "msg": "",
- "data": [],
- }
- q = request.args.get("q") or "."
- raw_tag = request.args.get("tags") or ""
- tags = ','.join(re.split('\s*,\s*', raw_tag))
- limit = int(request.args.get("limit") or 100)
- page = int(request.args.get("page") or 1)
- try:
- data = get_api_endpoints(q, tags, page, limit)
- ret['data'] = data
- ret['ok'] = True
- return json.dumps(ret)
- except Exception as e:
- abort(400, str(ret))
- @app.route("/api/counters", methods=["POST"])
- def api_get_counters():
- ret = {
- "ok": False,
- "msg": "",
- "data": [],
- }
- q = request.form.get("q") or ""
- limit = int(request.form.get("limit") or 50)
- page = int(request.form.get("page") or 1)
- eids = request.form.get("eids") or ""
- eids = eids and json.loads(eids) or []
- if not (eids or q):
- ret['msg'] = "no endpoints or counter given"
- return json.dumps(ret)
- h = {"Content-type": "application/json"}
- r = corelib.auth_requests("GET", config.API_ADDR + "/graph/endpoint_counter?eid=%s&metricQuery=%s&limit=%d&page=%d" %(",".join(eids), q, limit, page), headers=h)
- if r.status_code != 200:
- abort(400, r.text)
- j = r.json()
- counters_map = {}
- for x in j:
- counters_map[x['counter']] = [x['counter'], x['type'], x['step']]
- sorted_counters = sorted(counters_map.keys())
- sorted_values = [counters_map[x] for x in sorted_counters]
- ret['data'] = sorted_values
- ret['ok'] = True
- return json.dumps(ret)
- @app.route("/api/counters", methods=["DELETE"])
- def api_delete_counters():
- ret = {
- "ok": False,
- "msg": "",
- }
- endpoints = request.form.getlist("endpoints[]") or []
- counters = request.form.getlist("counters[]") or []
- if len(endpoints) == 0 or len(counters) == 0:
- ret['msg'] = "no endpoint and counter"
- return json.dumps(ret)
- h = {"Content-type": "application/json"}
- d = {
- "endpoints": endpoints,
- "counters": counters,
- }
- r = corelib.auth_requests("DELETE", config.API_ADDR + "/graph/counter", headers=h, data=json.dumps(d))
- if r.status_code != 200:
- abort(r.status_code, r.text)
- j = r.json()
- ret["ok"] = True
- ret["data"] = "%s counters affected" %j.get("affected_counter")
- return json.dumps(ret)
- @app.route("/api/endpoints", methods=["DELETE"])
- def api_delete_endpoints():
- ret = {
- "ok": False,
- "msg": "",
- }
- endpoints = request.form.getlist("endpoints[]") or []
- if len(endpoints) == 0:
- ret['msg'] = "no endpoint"
- return json.dumps(ret)
- h = {"Content-type": "application/json"}
- d = endpoints
- r = corelib.auth_requests("DELETE", config.API_ADDR + "/graph/endpoint", headers=h, data=json.dumps(d))
- if r.status_code != 200:
- abort(r.status_code, r.text)
- j = r.json()
- ret["ok"] = True
- ret["data"] = "%s counters affected, %s endpoints affected" %(j.get("affected_counter"), j.get("affected_endpoint"))
- return json.dumps(ret)
|