forked from scylladb/argus
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathargus_backend.py
More file actions
88 lines (76 loc) · 3.1 KB
/
argus_backend.py
File metadata and controls
88 lines (76 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import logging
import os
import cassandra.cluster
from flask import Flask, request
from prometheus_flask_exporter import NO_PREFIX
from argus.backend.error_handlers import DBErrorHandler
from argus.backend.metrics import METRICS
from argus.backend.template_filters import export_filters
from argus.backend.controller import admin, api, main
from argus.backend.cli import cli_bp
from argus.backend.util.logsetup import setup_application_logging
from argus.backend.util.encoders import ArgusJSONProvider
from argus.backend.db import ScyllaCluster
from argus.backend.controller import auth
from argus.backend.util.config import Config
from jwt import PyJWKClient
LOGGER = logging.getLogger(__name__)
def register_metrics():
METRICS.export_defaults(group_by="endpoint", prefix=NO_PREFIX)
METRICS.register_default(
METRICS.counter(
"http_request_by_endpoint_total",
"Total Requests made",
labels={
"endpoint": lambda: request.endpoint,
"method": lambda: request.method,
"status": lambda response: response.status,
},
)
)
def start_server(config=None) -> Flask:
app = Flask(__name__, static_url_path="/s/", static_folder="public")
METRICS.init_app(app)
if os.environ.get("PROMETHEUS_MULTIPROC_DIR"):
with app.app_context():
METRICS.register_endpoint("/metrics")
app.json_provider_class = ArgusJSONProvider
app.json = ArgusJSONProvider(app)
app.jinja_env.policies["json.dumps_kwargs"]["default"] = app.json.default
app.config.from_mapping(Config.load_yaml_config())
if config:
app.config.from_mapping(config)
if "cf" in app.config.get("LOGIN_METHODS", []):
cf_domain = app.config.get("CLOUDFLARE_ACCESS_TEAM_DOMAIN")
if cf_domain:
app.config["CLOUDFLARE_ACCESS_JWK_CLIENT"] = PyJWKClient(
f"https://{cf_domain}/cdn-cgi/access/certs",
cache_keys=True,
lifespan=3600,
timeout=5,
)
else:
LOGGER.warning("Cloudflare Access enabled but CLOUDFLARE_ACCESS_TEAM_DOMAIN is missing")
setup_application_logging(log_level=app.config["APP_LOG_LEVEL"])
app.logger.info("Starting Scylla Cluster connection...")
app.register_error_handler(cassandra.cluster.NoHostAvailable, DBErrorHandler.handle_db_errors)
app.register_error_handler(cassandra.cluster.NoConnectionsAvailable, DBErrorHandler.handle_db_errors)
ScyllaCluster.get(app.config)
ScyllaCluster.attach_to_app(app)
app.logger.info("Loading filters...")
for filter_func in export_filters():
app.add_template_filter(filter_func, name=filter_func.filter_name)
app.logger.info("Registering blueprints...")
app.register_blueprint(auth.bp)
app.register_blueprint(main.bp)
app.register_blueprint(api.bp)
app.register_blueprint(admin.bp)
app.register_blueprint(cli_bp)
with app.app_context():
try:
register_metrics()
except ValueError:
pass
app.logger.info("Ready.")
return app
argus_app = start_server()