Skip to content
Snippets Groups Projects
Commit c0bb8cd0 authored by geant-release-service's avatar geant-release-service
Browse files

Finished release 0.53.

parents 78a46c16 606979f3
Branches
Tags 0.53
No related merge requests found
import json import json
import logging.config import logging.config
import os import os
import pkg_resources
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
def setup_logging(): def setup_logging():
...@@ -13,6 +16,14 @@ def setup_logging(): ...@@ -13,6 +16,14 @@ def setup_logging():
default_filename = os.path.join( default_filename = os.path.join(
os.path.dirname(__file__), 'logging_default_config.json') os.path.dirname(__file__), 'logging_default_config.json')
filename = os.getenv('LOGGING_CONFIG', default_filename) filename = os.getenv('LOGGING_CONFIG', default_filename)
sentry_dsn = os.getenv('SENTRY_DSN')
if sentry_dsn:
sentry_sdk.init(
dsn=sentry_dsn,
integrations=[FlaskIntegration()],
release=pkg_resources.get_distribution('brian-dashboard-manager').version)
with open(filename) as f: with open(filename) as f:
# TODO: this mac workaround should be removed ... # TODO: this mac workaround should be removed ...
d = json.loads(f.read()) d = json.loads(f.read())
......
...@@ -4,12 +4,15 @@ Grafana Dashhboard API endpoints wrapper functions. ...@@ -4,12 +4,15 @@ Grafana Dashhboard API endpoints wrapper functions.
import logging import logging
import os import os
import json import json
import time
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from brian_dashboard_manager.grafana.utils.request import TokenRequest from brian_dashboard_manager.grafana.utils.request import TokenRequest
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
NUM_RETRIES = 3
def get_dashboard_definitions(dir=None): def get_dashboard_definitions(dir=None):
""" """
...@@ -231,9 +234,21 @@ def create_dashboard(request: TokenRequest, dashboard: dict, folder_id=None): ...@@ -231,9 +234,21 @@ def create_dashboard(request: TokenRequest, dashboard: dict, folder_id=None):
if folder_id: if folder_id:
payload['folderId'] = folder_id payload['folderId'] = folder_id
try: # retry up to NUM_RETRIES times
r = request.post('api/dashboards/db', json=payload) for _ in range(NUM_RETRIES):
return r.json() try:
except HTTPError: r = request.post('api/dashboards/db', json=payload)
logger.exception(f'Error when provisioning dashboard {title}') return r.json()
except HTTPError as e:
message = ''
if e.response is not None and e.response.status_code < 500:
# log the error message from Grafana
message = e.response.json()
# only retry on server side errors
if e.response is not None and e.response.status_code < 500:
break
logger.exception(f'Error when provisioning dashboard {title}: {message}')
time.sleep(1) # sleep for 1 second before retrying
return None return None
...@@ -708,9 +708,6 @@ def provision_maybe(config): ...@@ -708,9 +708,6 @@ def provision_maybe(config):
now = datetime.datetime.now() now = datetime.datetime.now()
write_timestamp(now.timestamp(), provisioning) write_timestamp(now.timestamp(), provisioning)
provision(config) provision(config)
except Exception as e:
logger.exception('Uncaught Exception:')
raise e
finally: finally:
now = datetime.datetime.now() now = datetime.datetime.now()
write_timestamp(now.timestamp(), False) write_timestamp(now.timestamp(), False)
...@@ -742,7 +739,7 @@ def provision(config): ...@@ -742,7 +739,7 @@ def provision(config):
return next( return next(
o for o in orgs_to_provision if o['name'] == org['name']) o for o in orgs_to_provision if o['name'] == org['name'])
except StopIteration: except StopIteration:
logger.error( logger.info(
f'Org {org["name"]} does not have valid configuration.') f'Org {org["name"]} does not have valid configuration.')
return None return None
......
...@@ -20,7 +20,7 @@ PANEL_WIDTH = 24 ...@@ -20,7 +20,7 @@ PANEL_WIDTH = 24
logger = logging.getLogger(__file__) logger = logging.getLogger(__file__)
def num_generator(start=1): def num_generator(start=30):
""" """
Generator for numbers starting from the value of `start` Generator for numbers starting from the value of `start`
......
...@@ -39,6 +39,23 @@ ...@@ -39,6 +39,23 @@
"version": 1, "version": 1,
"links": [], "links": [],
"panels": [ "panels": [
{
"datasource": null,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"content": "",
"mode": "html"
},
"pluginVersion": "8.2.5",
"title": "INFO: The average values displayed are only mean values for timescales of 2 days or less",
"type": "text"
},
{% for panel in aggregate_panels %} {% for panel in aggregate_panels %}
{{ panel }}, {{ panel }},
{% endfor %} {% endfor %}
......
...@@ -39,6 +39,23 @@ ...@@ -39,6 +39,23 @@
"version": 1, "version": 1,
"links": [], "links": [],
"panels": [ "panels": [
{
"datasource": null,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"content": "",
"mode": "html"
},
"pluginVersion": "8.2.5",
"title": "INFO: The average values displayed are only mean values for timescales of 2 days or less",
"type": "text"
}{{ "," if panels }}
{% for panel in panels %} {% for panel in panels %}
{{ panel }}{{ "," if not loop.last }} {{ panel }}{{ "," if not loop.last }}
{% endfor %} {% endfor %}
......
...@@ -2,6 +2,9 @@ ...@@ -2,6 +2,9 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [0.53] - 2023-06-21
- Add banner explaining difference between average/mean for >48h time ranges
## [0.52] - 2023-04-17 ## [0.52] - 2023-04-17
- Changed HTTP requests to reuse TCP connections to improve provisioning time - Changed HTTP requests to reuse TCP connections to improve provisioning time
- Changed Jinja template code to cache templates on startup - Changed Jinja template code to cache templates on startup
......
...@@ -9,3 +9,4 @@ responses ...@@ -9,3 +9,4 @@ responses
sphinx sphinx
sphinx-rtd-theme sphinx-rtd-theme
sentry-sdk[flask]
\ No newline at end of file
...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages ...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name='brian-dashboard-manager', name='brian-dashboard-manager',
version="0.52", version="0.53",
author='GEANT', author='GEANT',
author_email='swd@geant.org', author_email='swd@geant.org',
description='', description='',
...@@ -12,7 +12,8 @@ setup( ...@@ -12,7 +12,8 @@ setup(
'requests', 'requests',
'jsonschema', 'jsonschema',
'flask', 'flask',
'jinja2' 'jinja2',
'sentry-sdk[flask]'
], ],
include_package_data=True, include_package_data=True,
) )
...@@ -337,5 +337,5 @@ def test_provision_aggregate(data_config, mocker, client): ...@@ -337,5 +337,5 @@ def test_provision_aggregate(data_config, mocker, client):
panels = result['panels'] panels = result['panels']
expected_title = f'Aggregate - {TEST_DASHBOARD["dashboard_name"]}' expected_title = f'Aggregate - {TEST_DASHBOARD["dashboard_name"]}'
assert result['title'] == expected_title assert result['title'] == expected_title
assert len(panels) == 14 assert len(panels) == 15
assert len(panels[0]['targets']) == len(TEST_DASHBOARD['interfaces']) assert len(panels[1]['targets']) == len(TEST_DASHBOARD['interfaces'])
...@@ -195,7 +195,7 @@ def test_create_dashboard_no_uid_error(data_config): ...@@ -195,7 +195,7 @@ def test_create_dashboard_no_uid_error(data_config):
assert 'id' not in body['dashboard'] assert 'id' not in body['dashboard']
# have already tested a successful response, respond with error here. # have already tested a successful response, respond with error here.
return 400, {}, '' return 400, {}, '{}'
responses.add_callback( responses.add_callback(
method=responses.POST, method=responses.POST,
......
...@@ -3,6 +3,7 @@ envlist = py36 ...@@ -3,6 +3,7 @@ envlist = py36
[flake8] [flake8]
exclude = venv,.tox exclude = venv,.tox
max-line-length = 120
[testenv] [testenv]
setenv = setenv =
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment