|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
# Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors
|
|
|
#
|
|
|
# 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 copy
|
|
|
import logging
|
|
|
import datetime
|
|
|
import time
|
|
|
import random
|
|
|
import redis
|
|
|
import pyramid.renderers
|
|
|
import requests
|
|
|
|
|
|
from ziggurat_foundations.models.services.user import UserService
|
|
|
|
|
|
import appenlight.celery.tasks
|
|
|
from pyramid.view import view_config
|
|
|
from pyramid_mailer.message import Message
|
|
|
from appenlight_client.timing import time_trace
|
|
|
from appenlight.models import DBSession, Datastores
|
|
|
from appenlight.models.user import User
|
|
|
from appenlight.models.report_group import ReportGroup
|
|
|
from appenlight.models.event import Event
|
|
|
from appenlight.models.services.report_group import ReportGroupService
|
|
|
from appenlight.models.services.event import EventService
|
|
|
from appenlight.lib.enums import ReportType
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
GLOBAL_REQ = None
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=mail",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def mail(request):
|
|
|
"""
|
|
|
Test email communication
|
|
|
"""
|
|
|
request.environ["HTTP_HOST"] = "appenlight.com"
|
|
|
request.environ["wsgi.url_scheme"] = "https"
|
|
|
renderer_vars = {
|
|
|
"title": "You have just registered on AppEnlight",
|
|
|
"username": "test",
|
|
|
"email": "grzegżółka",
|
|
|
"firstname": "dupa",
|
|
|
}
|
|
|
# return vars
|
|
|
html = pyramid.renderers.render(
|
|
|
"/email_templates/registered.jinja2", renderer_vars, request=request
|
|
|
)
|
|
|
message = Message(
|
|
|
subject="hello world %s" % random.randint(1, 9999),
|
|
|
sender="info@appenlight.com",
|
|
|
recipients=["ergo14@gmail.com"],
|
|
|
html=html,
|
|
|
)
|
|
|
request.registry.mailer.send(message)
|
|
|
return html
|
|
|
return vars
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=alerting",
|
|
|
renderer="appenlight:templates/tests/alerting.jinja2",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def alerting_test(request):
|
|
|
"""
|
|
|
Allows to test send data on various registered alerting channels
|
|
|
"""
|
|
|
applications = UserService.resources_with_perms(
|
|
|
request.user, ["view"], resource_types=["application"]
|
|
|
)
|
|
|
# what we can select in total
|
|
|
all_possible_app_ids = [app.resource_id for app in applications]
|
|
|
resource = applications[0]
|
|
|
|
|
|
alert_channels = []
|
|
|
for channel in request.user.alert_channels:
|
|
|
alert_channels.append(channel.get_dict())
|
|
|
|
|
|
cname = request.params.get("channel_name")
|
|
|
cvalue = request.params.get("channel_value")
|
|
|
event_name = request.params.get("event_name")
|
|
|
if cname and cvalue:
|
|
|
for channel in request.user.alert_channels:
|
|
|
if channel.channel_value == cvalue and channel.channel_name == cname:
|
|
|
break
|
|
|
if event_name in ["error_report_alert", "slow_report_alert"]:
|
|
|
# opened
|
|
|
new_event = Event(
|
|
|
resource_id=resource.resource_id,
|
|
|
event_type=Event.types[event_name],
|
|
|
start_date=datetime.datetime.utcnow(),
|
|
|
status=Event.statuses["active"],
|
|
|
values={"reports": 5, "threshold": 10},
|
|
|
)
|
|
|
channel.notify_alert(
|
|
|
resource=resource, event=new_event, user=request.user, request=request
|
|
|
)
|
|
|
|
|
|
# closed
|
|
|
ev_type = Event.types[event_name.replace("open", "close")]
|
|
|
new_event = Event(
|
|
|
resource_id=resource.resource_id,
|
|
|
event_type=ev_type,
|
|
|
start_date=datetime.datetime.utcnow(),
|
|
|
status=Event.statuses["closed"],
|
|
|
values={"reports": 5, "threshold": 10},
|
|
|
)
|
|
|
channel.notify_alert(
|
|
|
resource=resource, event=new_event, user=request.user, request=request
|
|
|
)
|
|
|
elif event_name == "notify_reports":
|
|
|
report = (
|
|
|
ReportGroupService.by_app_ids(all_possible_app_ids)
|
|
|
.filter(ReportGroup.report_type == ReportType.error)
|
|
|
.first()
|
|
|
)
|
|
|
confirmed_reports = [(5, report), (1, report)]
|
|
|
channel.notify_reports(
|
|
|
resource=resource,
|
|
|
user=request.user,
|
|
|
request=request,
|
|
|
since_when=datetime.datetime.utcnow(),
|
|
|
reports=confirmed_reports,
|
|
|
)
|
|
|
confirmed_reports = [(5, report)]
|
|
|
channel.notify_reports(
|
|
|
resource=resource,
|
|
|
user=request.user,
|
|
|
request=request,
|
|
|
since_when=datetime.datetime.utcnow(),
|
|
|
reports=confirmed_reports,
|
|
|
)
|
|
|
elif event_name == "notify_uptime":
|
|
|
new_event = Event(
|
|
|
resource_id=resource.resource_id,
|
|
|
event_type=Event.types["uptime_alert"],
|
|
|
start_date=datetime.datetime.utcnow(),
|
|
|
status=Event.statuses["active"],
|
|
|
values={"status_code": 500, "tries": 2, "response_time": 0},
|
|
|
)
|
|
|
channel.notify_uptime_alert(
|
|
|
resource=resource, event=new_event, user=request.user, request=request
|
|
|
)
|
|
|
elif event_name == "chart_alert":
|
|
|
event = EventService.by_type_and_status(
|
|
|
event_types=(Event.types["chart_alert"],),
|
|
|
status_types=(Event.statuses["active"],),
|
|
|
).first()
|
|
|
channel.notify_chart_alert(
|
|
|
resource=event.resource, event=event, user=request.user, request=request
|
|
|
)
|
|
|
elif event_name == "daily_digest":
|
|
|
since_when = datetime.datetime.utcnow() - datetime.timedelta(hours=8)
|
|
|
filter_settings = {
|
|
|
"resource": [resource.resource_id],
|
|
|
"tags": [{"name": "type", "value": ["error"], "op": None}],
|
|
|
"type": "error",
|
|
|
"start_date": since_when,
|
|
|
}
|
|
|
|
|
|
reports = ReportGroupService.get_trending(
|
|
|
request, filter_settings=filter_settings, limit=50
|
|
|
)
|
|
|
channel.send_digest(
|
|
|
resource=resource,
|
|
|
user=request.user,
|
|
|
request=request,
|
|
|
since_when=datetime.datetime.utcnow(),
|
|
|
reports=reports,
|
|
|
)
|
|
|
|
|
|
return {
|
|
|
"alert_channels": alert_channels,
|
|
|
"applications": dict(
|
|
|
[(app.resource_id, app.resource_name) for app in applications.all()]
|
|
|
),
|
|
|
}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=error",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def error(request):
|
|
|
"""
|
|
|
Raises an internal error with some test data for testing purposes
|
|
|
"""
|
|
|
request.environ["appenlight.message"] = "test message"
|
|
|
request.environ["appenlight.extra"]["dupa"] = "dupa"
|
|
|
request.environ["appenlight.extra"]["message"] = "message"
|
|
|
request.environ["appenlight.tags"]["action"] = "test_error"
|
|
|
request.environ["appenlight.tags"]["count"] = 5
|
|
|
log.debug(chr(960))
|
|
|
log.debug("debug")
|
|
|
log.info(chr(960))
|
|
|
log.info("INFO")
|
|
|
log.warning("warning")
|
|
|
|
|
|
@time_trace(name="error.foobar", min_duration=0.1)
|
|
|
def fooobar():
|
|
|
time.sleep(0.12)
|
|
|
return 1
|
|
|
|
|
|
fooobar()
|
|
|
|
|
|
def foobar(somearg):
|
|
|
raise Exception("test")
|
|
|
|
|
|
client = redis.StrictRedis()
|
|
|
client.setex("testval", 10, "foo")
|
|
|
request.environ["appenlight.force_send"] = 1
|
|
|
|
|
|
# stats, result = get_local_storage(local_timing).get_thread_stats()
|
|
|
# import pprint
|
|
|
# pprint.pprint(stats)
|
|
|
# pprint.pprint(result)
|
|
|
# print 'entries', len(result)
|
|
|
request.environ["appenlight.username"] = "ErgO"
|
|
|
raise Exception(chr(960) + "%s" % random.randint(1, 5))
|
|
|
return {}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=task",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def test_task(request):
|
|
|
"""
|
|
|
Test erroneous celery task
|
|
|
"""
|
|
|
import appenlight.celery.tasks
|
|
|
|
|
|
appenlight.celery.tasks.test_exception_task.delay()
|
|
|
return "task sent"
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=task_retry",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def test_task_retry(request):
|
|
|
"""
|
|
|
Test erroneous celery task
|
|
|
"""
|
|
|
import appenlight.celery.tasks
|
|
|
|
|
|
appenlight.celery.tasks.test_retry_exception_task.delay()
|
|
|
return "task sent"
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=celery_emails",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def test_celery_emails(request):
|
|
|
import appenlight.celery.tasks
|
|
|
|
|
|
appenlight.celery.tasks.alerting.delay()
|
|
|
return "task sent"
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=daily_digest",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def test_celery_daily_digest(request):
|
|
|
import appenlight.celery.tasks
|
|
|
|
|
|
appenlight.celery.tasks.daily_digest.delay()
|
|
|
return "task sent"
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=celery_alerting",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def test_celery_alerting(request):
|
|
|
import appenlight.celery.tasks
|
|
|
|
|
|
appenlight.celery.tasks.alerting()
|
|
|
return "task sent"
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=logging",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def logs(request):
|
|
|
"""
|
|
|
Test some in-app logging
|
|
|
"""
|
|
|
log.debug(chr(960))
|
|
|
log.debug("debug")
|
|
|
log.info(chr(960))
|
|
|
log.info("INFO")
|
|
|
log.warning(
|
|
|
"Matched GET /\xc4\x85\xc5\xbc\xc4\x87" "\xc4\x99\xc4\x99\xc4\x85/summary"
|
|
|
)
|
|
|
log.warning(
|
|
|
"XXXXMatched GET /\xc4\x85\xc5\xbc\xc4" "\x87\xc4\x99\xc4\x99\xc4\x85/summary"
|
|
|
)
|
|
|
log.warning("DUPA /ążćęęą")
|
|
|
log.warning("g\u017ceg\u017c\u00f3\u0142ka")
|
|
|
log.error(
|
|
|
"TEST Lorem ipsum2",
|
|
|
extra={"user": "ergo", "commit": "sog8ds0g7sdih12hh1j512h5k"},
|
|
|
)
|
|
|
log.fatal("TEST Lorem ipsum3")
|
|
|
log.warning(
|
|
|
"TEST Lorem ipsum",
|
|
|
extra={
|
|
|
"action": "purchase",
|
|
|
"price": random.random() * 100,
|
|
|
"quantity": random.randint(1, 99),
|
|
|
},
|
|
|
)
|
|
|
log.warning(
|
|
|
"test_pkey",
|
|
|
extra={
|
|
|
"action": "test_pkey",
|
|
|
"price": random.random() * 100,
|
|
|
"ae_primary_key": 1,
|
|
|
"quantity": random.randint(1, 99),
|
|
|
},
|
|
|
)
|
|
|
log.warning(
|
|
|
"test_pkey2",
|
|
|
extra={
|
|
|
"action": "test_pkey",
|
|
|
"price": random.random() * 100,
|
|
|
"ae_primary_key": "b",
|
|
|
"ae_permanent": "t",
|
|
|
"quantity": random.randint(1, 99),
|
|
|
},
|
|
|
)
|
|
|
log.warning(
|
|
|
"test_pkey3",
|
|
|
extra={
|
|
|
"action": "test_pkey",
|
|
|
"price": random.random() * 100,
|
|
|
"ae_primary_key": 1,
|
|
|
"quantity": random.randint(1, 99),
|
|
|
},
|
|
|
)
|
|
|
log.warning(
|
|
|
"test_pkey4",
|
|
|
extra={
|
|
|
"action": "test_pkey",
|
|
|
"price": random.random() * 100,
|
|
|
"ae_primary_key": "b",
|
|
|
"ae_permanent": True,
|
|
|
"quantity": random.randint(1, 99),
|
|
|
},
|
|
|
)
|
|
|
request.environ["appenlight.force_send"] = 1
|
|
|
return {}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=transaction",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def transaction_test(request):
|
|
|
"""
|
|
|
Test transactions
|
|
|
"""
|
|
|
try:
|
|
|
result = DBSession.execute("SELECT 1/0")
|
|
|
except:
|
|
|
request.tm.abort()
|
|
|
result = DBSession.execute("SELECT 1")
|
|
|
return "OK"
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=slow_request",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def slow_request(request):
|
|
|
"""
|
|
|
Test a request that has some slow entries - including nested calls
|
|
|
"""
|
|
|
users = DBSession.query(User).all()
|
|
|
import random
|
|
|
|
|
|
some_val = random.random()
|
|
|
import threading
|
|
|
|
|
|
t_id = id(threading.currentThread())
|
|
|
log.warning("slow_log %s %s " % (some_val, t_id))
|
|
|
log.critical("tid %s" % t_id)
|
|
|
|
|
|
@time_trace(name="baz_func %s" % some_val, min_duration=0.1)
|
|
|
def baz(arg):
|
|
|
time.sleep(0.32)
|
|
|
return arg
|
|
|
|
|
|
requests.get("http://ubuntu.com")
|
|
|
|
|
|
@time_trace(name="foo_func %s %s" % (some_val, t_id), min_duration=0.1)
|
|
|
def foo(arg):
|
|
|
time.sleep(0.52)
|
|
|
log.warning("foo_func %s %s" % (some_val, t_id))
|
|
|
requests.get("http://ubuntu.com?test=%s" % some_val)
|
|
|
return bar(arg)
|
|
|
|
|
|
@time_trace(name="bar_func %s %s" % (some_val, t_id), min_duration=0.1)
|
|
|
def bar(arg):
|
|
|
log.warning("bar_func %s %s" % (some_val, t_id))
|
|
|
time.sleep(1.52)
|
|
|
baz(arg)
|
|
|
baz(arg)
|
|
|
return baz(arg)
|
|
|
|
|
|
foo("a")
|
|
|
return {}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=styling",
|
|
|
renderer="appenlight:templates/tests/styling.jinja2",
|
|
|
permission="__no_permission_required__",
|
|
|
)
|
|
|
def styling(request):
|
|
|
"""
|
|
|
Some styling test page
|
|
|
"""
|
|
|
_ = str
|
|
|
request.session.flash(
|
|
|
_("Your password got updated. " "Next time log in with your new credentials.")
|
|
|
)
|
|
|
request.session.flash(
|
|
|
_(
|
|
|
"Something went wrong when we "
|
|
|
"tried to authorize you via external provider"
|
|
|
),
|
|
|
"warning",
|
|
|
)
|
|
|
request.session.flash(
|
|
|
_(
|
|
|
"Unfortunately there was a problem "
|
|
|
"processing your payment, please try again later."
|
|
|
),
|
|
|
"error",
|
|
|
)
|
|
|
return {}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=js_error",
|
|
|
renderer="appenlight:templates/tests/js_error.jinja2",
|
|
|
permission="__no_permission_required__",
|
|
|
)
|
|
|
def js(request):
|
|
|
"""
|
|
|
Used for testing javasctipt client for error catching
|
|
|
"""
|
|
|
return {}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=js_log",
|
|
|
renderer="appenlight:templates/tests/js_log.jinja2",
|
|
|
permission="__no_permission_required__",
|
|
|
)
|
|
|
def js_log(request):
|
|
|
"""
|
|
|
Used for testing javasctipt client for logging
|
|
|
"""
|
|
|
return {}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=log_requests",
|
|
|
renderer="string",
|
|
|
permission="__no_permission_required__",
|
|
|
)
|
|
|
def log_requests(request):
|
|
|
"""
|
|
|
Util view for printing json requests
|
|
|
"""
|
|
|
return {}
|
|
|
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=url",
|
|
|
renderer="string",
|
|
|
permission="__no_permission_required__",
|
|
|
)
|
|
|
def log_requests(request):
|
|
|
"""
|
|
|
I have no fucking clue why I needed that ;-)
|
|
|
"""
|
|
|
return request.route_url("reports", _app_url="https://appenlight.com")
|
|
|
|
|
|
|
|
|
class TestClass(object):
|
|
|
"""
|
|
|
Used to test if class-based view name resolution works correctly
|
|
|
"""
|
|
|
|
|
|
def __init__(self, request):
|
|
|
self.request = request
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=test_a",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=test_c",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=test_d",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def test_a(self):
|
|
|
return "ok"
|
|
|
|
|
|
@view_config(
|
|
|
route_name="test",
|
|
|
match_param="action=test_b",
|
|
|
renderer="string",
|
|
|
permission="root_administration",
|
|
|
)
|
|
|
def test_b(self):
|
|
|
return "ok"
|
|
|
|