summaryrefslogtreecommitdiffstats
path: root/clover/controller
diff options
context:
space:
mode:
Diffstat (limited to 'clover/controller')
-rw-r--r--clover/controller/control/api/collector.py51
-rw-r--r--clover/controller/control/api/visibility.py100
-rw-r--r--clover/controller/control/control.py2
3 files changed, 132 insertions, 21 deletions
diff --git a/clover/controller/control/api/collector.py b/clover/controller/control/api/collector.py
index c82c543..3abcba7 100644
--- a/clover/controller/control/api/collector.py
+++ b/clover/controller/control/api/collector.py
@@ -5,7 +5,7 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
-from flask import Blueprint, request, jsonify, Response
+from flask import Blueprint, request, Response
import grpc
import pickle
import collector_pb2
@@ -17,13 +17,13 @@ import logging
collector = Blueprint('collector', __name__)
grpc_port = '50054'
-pod_name = 'clover-collector'
+pod_name = 'clover-collector.clover-system'
collector_grpc = pod_name + ':' + grpc_port
channel = grpc.insecure_channel(collector_grpc)
stub = collector_pb2_grpc.ControllerStub(channel)
-CASSANDRA_HOSTS = pickle.dumps(['cassandra.default'])
+CASSANDRA_HOSTS = pickle.dumps(['cassandra.clover-system'])
-HOST_IP = 'redis'
+HOST_IP = 'redis.default'
@collector.route("/collector/init")
@@ -62,7 +62,7 @@ def start():
p = request.json
if not p:
sample_interval = '5'
- t_host = 'jaeger-deployment.istio-system'
+ t_host = 'tracing.istio-system'
t_port = '16686'
m_host = 'prometheus.istio-system'
m_port = '9090'
@@ -103,27 +103,36 @@ def stop():
return response.message
-@collector.route("/collector/stats", methods=['GET', 'POST'])
-def stats():
+@collector.route("/collector/set", methods=['GET', 'POST'])
+def set_collector():
try:
p = request.json
- if not p:
- stat_type = 'toplevel'
- else:
- stat_type = p['stat_type']
r = redis.StrictRedis(host=HOST_IP, port=6379, db=0)
- content = {}
- content['proxy_rt'] = r.get('proxy_rt')
- content['trace_count'] = r.get('trace_count')
- content['span_urls'] = list(r.smembers('span_urls'))
- response = jsonify(content)
+ del_keys = ['visibility_services', 'metric_prefixes',
+ 'metric_suffixes', 'custom_metrics']
+ for dk in del_keys:
+ r.delete(dk)
+
+ try:
+ for service in p['services']:
+ r.sadd('visibility_services', service['name'])
+ except (KeyError, ValueError) as e:
+ logging.debug(e)
+ return Response(
+ "Specify at least one service to track", status=400)
+ if p['metric_prefixes'] and p['metric_suffixes']:
+ for prefix in p['metric_prefixes']:
+ r.sadd('metric_prefixes', prefix['prefix'])
+ for suffix in p['metric_suffixes']:
+ r.sadd('metric_suffixes', suffix['suffix'])
+ if p['custom_metrics']:
+ for metric in p['custom_metrics']:
+ r.sadd('custom_metrics', metric['metric'])
+
except Exception as e:
logging.debug(e)
- if e.__class__.__name__ == "_Rendezvous":
- return Response("Error connecting via gRPC", status=400)
- else:
- return Response("Error getting visibility stats", status=400)
- return response
+ return Response("Error setting visibility config", status=400)
+ return Response("Updated visibility config", status=200)
@collector.route("/collector/test")
diff --git a/clover/controller/control/api/visibility.py b/clover/controller/control/api/visibility.py
new file mode 100644
index 0000000..23eb714
--- /dev/null
+++ b/clover/controller/control/api/visibility.py
@@ -0,0 +1,100 @@
+# Copyright (c) Authors of Clover
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+
+from flask import Blueprint, request, jsonify, Response
+import redis
+import logging
+import collector
+
+visibility_api = Blueprint('visibility_api', __name__)
+
+HOST_IP = 'redis.default'
+
+
+@visibility_api.route("/visibility/clear")
+def clear_visibility():
+ # Zero out or delete redis keys with results
+ r = redis.StrictRedis(host=HOST_IP, port=6379, db=0)
+ r.set('proxy_rt', 0)
+ r.set('trace_count', 0)
+ r.set('span_count', 0)
+ del_keys = ['span_user_agent', 'span_urls', 'span_urls_z',
+ 'span_status_codes_z', 'span_node_url_z', 'span_node_id_z',
+ 'span_user_agent_z']
+ for dk in del_keys:
+ r.delete(dk)
+ # Truncate cassandra tables
+ return collector.truncate()
+
+
+@visibility_api.route(
+ "/visibility/get/stats/<s_type>", methods=['GET', 'POST'])
+def get_visibility_stats(s_type):
+ try:
+
+ p = request.json
+ if not p:
+ stat_type = s_type
+ else:
+ stat_type = p['stat_type']
+
+ r = redis.StrictRedis(host=HOST_IP, port=6379, db=0)
+
+ content = {}
+ if stat_type == 'system' or s_type == 'all':
+ content['trace_count'] = r.get('trace_count')
+ content['span_count'] = r.get('span_count')
+ if stat_type == 'metrics' or s_type == 'all':
+ content['metrics_test'] = r.lrange('metrics_test', 0, 200)
+ if stat_type == 'tracing' or s_type == 'all':
+ content['proxy_rt'] = r.get('proxy_rt')
+ content['span_urls'] = list(r.smembers('span_urls'))
+ content['user_agents'] = list(r.smembers('span_user_agent'))
+ content['user_agent_count'] = r.zrange(
+ "span_user_agent_z", 0, 50, False, True)
+ content['request_url_count'] = r.zrange(
+ "span_urls_z", 0, 50, False, True)
+ content['status_code_count'] = r.zrange(
+ "span_status_codes_z", 0, 50, False, True)
+ content['node_url_count'] = r.zrange(
+ "span_node_url_z", 0, 50, False, True)
+ content['node_id_count'] = r.zrange(
+ "span_node_id_z", 0, 50, False, True)
+
+ response = jsonify(content)
+ return response
+ except Exception as e:
+ logging.debug(e)
+ return Response("Error getting visibility stats", status=400)
+
+
+@visibility_api.route("/visibility/get/<c_type>", methods=['GET', 'POST'])
+def get_visibility_config(c_type):
+ try:
+
+ r = redis.StrictRedis(host=HOST_IP, port=6379, db=0)
+
+ content = {}
+
+ if c_type == 'services' or c_type == 'all':
+ services = list(r.smembers('visibility_services'))
+ content['visibility_services'] = services
+ if c_type == 'metrics' or c_type == 'all':
+ content['metric_prefixes'] = list(r.smembers('metric_prefixes'))
+ content['metric_suffixes'] = list(r.smembers('metric_suffixes'))
+ content['custom_metrics'] = list(r.smembers('custom_metrics'))
+
+ response = jsonify(content)
+ return response
+ except Exception as e:
+ logging.debug(e)
+ return Response("Error getting visibility config", status=400)
+
+
+@visibility_api.route("/visibility/set", methods=['GET', 'POST'])
+def set_visibility():
+ return collector.set_collector()
diff --git a/clover/controller/control/control.py b/clover/controller/control/control.py
index 70eeacd..a54c762 100644
--- a/clover/controller/control/control.py
+++ b/clover/controller/control/control.py
@@ -8,6 +8,7 @@
from flask import Flask, request, jsonify
from views.dashboard import simple_page
from api.collector import collector
+from api.visibility_api import visibility_api
from api.snort import snort
from api.halyard import halyard
from api.nginx import nginx
@@ -23,6 +24,7 @@ try:
# Register blueprints
application.register_blueprint(simple_page)
application.register_blueprint(collector)
+ application.register_blueprint(visibility_api)
application.register_blueprint(snort)
application.register_blueprint(halyard)
application.register_blueprint(nginx)