Skip to content

Commit

Permalink
chore(metrics): Added more metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
Edward Malinowski authored and Edward Malinowski committed Jun 26, 2024
1 parent ee4040e commit a17c76f
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 106 deletions.
5 changes: 2 additions & 3 deletions fence/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,16 +86,15 @@ def app_init(
):
app.__dict__["logger"] = warn_about_logger

metrics.initialize_metrics(app)

app_config(
app,
settings=settings,
root_dir=root_dir,
config_path=config_path,
file_name=config_file_name,
)

import fence.metrics

app_sessions(app)
app_register_blueprints(app)
server.init_app(app, query_client=query_client)
Expand Down
30 changes: 22 additions & 8 deletions fence/blueprints/data/indexd.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,13 +197,17 @@ def _log_signed_url_data_info(indexed_file, user_sub, client_id, requested_proto
f"acl={acl} authz={authz} bucket={bucket} user_sub={user_sub} client_id={client_id}"
)

from fence.metrics import (
presigned_url_counter,
presigned_url_data_metrics_size_gauge,
)
from fence.metrics import metrics

presigned_url_counter = metrics.presigned_url_counter
if presigned_url_counter:
presigned_url_counter.inc()

presigned_url_counter.inc()
presigned_url_data_metrics_size_gauge.set(size_in_kibibytes)
presigned_url_data_metrics_size_gauge = (
metrics.presigned_url_data_metrics_size_gauge
)
if presigned_url_data_metrics_size_gauge:
presigned_url_data_metrics_size_gauge.set(size_in_kibibytes)


def _get_client_id():
Expand Down Expand Up @@ -1068,9 +1072,13 @@ def get_signed_url(
auth_info,
)

from fence.metrics import presigned_url_download_protocol_s3_counter
from fence.metrics import metrics

presigned_url_download_protocol_s3_counter.inc()
presigned_url_download_protocol_s3_counter = (
metrics.presigned_url_download_protocol_s3_counter
)
if presigned_url_download_protocol_s3_counter:
presigned_url_download_protocol_s3_counter.inc()

return url

Expand Down Expand Up @@ -1208,6 +1216,12 @@ def get_signed_url(

presigned_url_download_protocol_gcs_counter.inc()

presigned_url_download_protocol_gcs_counter = (
metrics.presigned_url_download_protocol_gcs_counter
)
if presigned_url_download_protocol_gcs_counter:
presigned_url_download_protocol_gcs_counter.inc()

return url

def _generate_anonymous_google_storage_signed_url(
Expand Down
6 changes: 4 additions & 2 deletions fence/blueprints/ga4gh.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,10 @@ def get_ga4gh_signed_url(object_id, access_id):
ga4gh_passports=ga4gh_passports,
)

from fence.metrics import presigned_urls_ga4gh_drs_counter
from fence.metrics import metrics

presigned_urls_ga4gh_drs_counter.inc()
presigned_urls_ga4gh_drs_counter = metrics.presigned_urls_ga4gh_drs_counter
if presigned_urls_ga4gh_drs_counter:
presigned_urls_ga4gh_drs_counter.inc()

return flask.jsonify(result)
6 changes: 4 additions & 2 deletions fence/blueprints/login/fence_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,11 @@ def get(self):
)
self.post_login()

from fence.metrics import fence_login_counter
from fence.metrics import metrics

fence_login_counter.inc()
fence_login_counter = metrics.fence_login_counter
if fence_login_counter:
fence_login_counter.inc()

if config["REGISTER_USERS_ON"]:
if not flask.g.user.additional_info.get("registration_info"):
Expand Down
6 changes: 4 additions & 2 deletions fence/blueprints/login/google.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ def get(self):
+ "/link/google/callback?code={}".format(flask.request.args.get("code"))
)

from fence.metrics import google_login_counter
from fence.metrics import metrics

google_login_counter.inc()
google_login_counter = metrics.google_login_counter
if google_login_counter:
google_login_counter.inc()

return super(GoogleCallback, self).get()
6 changes: 4 additions & 2 deletions fence/blueprints/login/ras.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,11 @@ def post_login(self, user=None, token_result=None, id_from_idp=None):
expires,
)

from fence.metrics import ras_login_counter
from fence.metrics import metrics

ras_login_counter.inc()
ras_login_counter = metrics.ras_login_counter
if ras_login_counter:
ras_login_counter.inc()

flask.current_app.ras_client.store_refresh_token(
user=user, refresh_token=refresh_token, expires=expires + issued_time
Expand Down
164 changes: 77 additions & 87 deletions fence/metrics.py
Original file line number Diff line number Diff line change
@@ -1,93 +1,83 @@
import tempfile
import os
from fence.config import config
from fence import app
from prometheus_client import (
CollectorRegistry,
multiprocess,
make_wsgi_app,
Counter,
Gauge,
)


# for some reason the temp dir does not get created properly if we move
# this statement to `_setup_prometheus()`
PROMETHEUS_TMP_COUNTER_DIR = tempfile.TemporaryDirectory()


if config["ENABLE_PROMETHEUS_METRICS"]:
from fence import logger

app.prometheus_counters = {}
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from prometheus_client import (
CollectorRegistry,
multiprocess,
make_wsgi_app,
Counter,
Gauge,
)

# This environment variable MUST be declared before importing the
# prometheus modules (or unit tests fail)
# More details on this awkwardness: https://github.com/prometheus/client_python/issues/250
os.environ["prometheus_multiproc_dir"] = PROMETHEUS_TMP_COUNTER_DIR.name

app.prometheus_registry = CollectorRegistry()
multiprocess.MultiProcessCollector(app.prometheus_registry)

# Add prometheus wsgi middleware to route /metrics requests
app.wsgi_app = DispatcherMiddleware(
app.wsgi_app, {"/metrics": make_wsgi_app(registry=app.prometheus_registry)}
)

presigned_url_counter = Counter(
"fence_presigned_url_requests_total",
"Total number of presigned URL requests",
registry=app.prometheus_registry,
)

login_counter = Counter(
"fence_all_login_requests_total",
"Total number of login requests",
registry=app.prometheus_registry,
)

fence_login_counter = Counter(
"fence_login_requests_total",
"Total number of fence login requests",
registry=app.prometheus_registry,
)

google_login_counter = Counter(
"google_login_requests_total",
"Total number of Google login requests",
registry=app.prometheus_registry,
)

ras_login_counter = Counter(
"fence_ras_login_requests_total",
"Total number of RAS login requests",
registry=app.prometheus_registry,
)

presigned_urls_ga4gh_drs_counter = Counter(
"fence_presigned_urls_ga4gh_drs_requests_total",
"Total number of presigned URL requests for GA4GH DRS",
registry=app.prometheus_registry,
)

presigned_url_download_protocol_gcs_counter = Counter(
"fence_presigned_url_download_protocol_gcs_requests_total",
"Total number of presigned URL requests for GCS",
registry=app.prometheus_registry,
)

presigned_url_download_protocol_s3_counter = Counter(
"fence_presigned_url_download_protocol_s3_requests_total",
"Total number of presigned URL requests for S3",
registry=app.prometheus_registry,
)

presigned_url_data_metrics_size_gauge = Gauge(
"fence_presigned_url_data_metrics_size_bytes",
"Size of data metrics in bytes",
registry=app.prometheus_registry,
)

else:
logger.info("Prometheus metrics are NOT enabled.")
class Metrics:
def __init__(self):
self.app = app
self.presigned_url_counter = None
self.login_counter = None
self.fence_login_counter = None
self.google_login_counter = None
self.ras_login_counter = None
self.presigned_urls_ga4gh_drs_counter = None
self.presigned_url_download_protocol_gcs_counter = None
self.presigned_url_download_protocol_s3_counter = None
self.presigned_url_data_metrics_size_gauge = None

def initialize_metrics(self, app):
os.environ["prometheus_multiproc_dir"] = PROMETHEUS_TMP_COUNTER_DIR.name
app.prometheus_registry = CollectorRegistry()
multiprocess.MultiProcessCollector(app.prometheus_registry)

# Add prometheus wsgi middleware to route /metrics requests
app.wsgi_app = DispatcherMiddleware(
app.wsgi_app, {"/metrics": make_wsgi_app(registry=app.prometheus_registry)}
)
self.presigned_url_counter = Counter(
"fence_presigned_url_requests_total",
"Total number of presigned URL requests",
registry=self.app.prometheus_registry,
)
self.login_counter = Counter(
"fence_all_login_requests_total",
"Total number of login requests",
registry=self.app.prometheus_registry,
)
self.fence_login_counter = Counter(
"fence_login_requests_total",
"Total number of fence login requests",
registry=self.app.prometheus_registry,
)
self.google_login_counter = Counter(
"google_login_requests_total",
"Total number of Google login requests",
registry=self.app.prometheus_registry,
)
self.ras_login_counter = Counter(
"fence_ras_login_requests_total",
"Total number of RAS login requests",
registry=self.app.prometheus_registry,
)
self.presigned_urls_ga4gh_drs_counter = Counter(
"fence_presigned_urls_ga4gh_drs_requests_total",
"Total number of presigned URL requests for GA4GH DRS",
registry=self.app.prometheus_registry,
)
self.presigned_url_download_protocol_gcs_counter = Counter(
"fence_presigned_url_download_protocol_gcs_requests_total",
"Total number of presigned URL requests for GCS",
registry=self.app.prometheus_registry,
)
self.presigned_url_download_protocol_s3_counter = Counter(
"fence_presigned_url_download_protocol_s3_requests_total",
"Total number of presigned URL requests for S3",
registry=self.app.prometheus_registry,
)
self.presigned_url_data_metrics_size_gauge = Gauge(
"fence_presigned_url_data_metrics_size_bytes",
"Size of data metrics in bytes",
registry=self.app.prometheus_registry,
)


metrics = Metrics()

0 comments on commit a17c76f

Please sign in to comment.