mirror of https://github.com/zulip/zulip.git
integration: Delete Opbeat integration.
Opbeat was acquired by Elastic in 2017[1] and maintained until Elastic APM went live[2]. Now that Elastic APM is online, it looks like Opbeat repositories have been marked as archived/unmaintained[3]. [1]: https://www.elastic.co/blog/welcome-opbeat-to-the-elastic-family [2]: https://www.elastic.co/observability/application-performance-monitoring [3]: https://github.com/opbeat
This commit is contained in:
parent
60eb621477
commit
9494620022
Binary file not shown.
Before Width: | Height: | Size: 4.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
Before Width: | Height: | Size: 50 KiB |
|
@ -444,13 +444,6 @@ WEBHOOK_INTEGRATIONS: list[WebhookIntegration] = [
|
||||||
WebhookIntegration("mention", ["marketing"], display_name="Mention"),
|
WebhookIntegration("mention", ["marketing"], display_name="Mention"),
|
||||||
WebhookIntegration("netlify", ["continuous-integration", "deployment"], display_name="Netlify"),
|
WebhookIntegration("netlify", ["continuous-integration", "deployment"], display_name="Netlify"),
|
||||||
WebhookIntegration("newrelic", ["monitoring"], display_name="New Relic"),
|
WebhookIntegration("newrelic", ["monitoring"], display_name="New Relic"),
|
||||||
WebhookIntegration(
|
|
||||||
"opbeat",
|
|
||||||
["monitoring"],
|
|
||||||
display_name="Opbeat",
|
|
||||||
stream_name="opbeat",
|
|
||||||
function="zerver.webhooks.opbeat.view.api_opbeat_webhook",
|
|
||||||
),
|
|
||||||
WebhookIntegration("opencollective", ["communication"], display_name="Open Collective"),
|
WebhookIntegration("opencollective", ["communication"], display_name="Open Collective"),
|
||||||
WebhookIntegration("opsgenie", ["meta-integration", "monitoring"]),
|
WebhookIntegration("opsgenie", ["meta-integration", "monitoring"]),
|
||||||
WebhookIntegration("pagerduty", ["monitoring"], display_name="PagerDuty"),
|
WebhookIntegration("pagerduty", ["monitoring"], display_name="PagerDuty"),
|
||||||
|
@ -785,7 +778,6 @@ DOC_SCREENSHOT_CONFIG: dict[str, list[BaseScreenshotConfig]] = {
|
||||||
ScreenshotConfig("incident_acknowledged_new.json", "002.png"),
|
ScreenshotConfig("incident_acknowledged_new.json", "002.png"),
|
||||||
ScreenshotConfig("incident_closed_new.json", "003.png"),
|
ScreenshotConfig("incident_closed_new.json", "003.png"),
|
||||||
],
|
],
|
||||||
"opbeat": [ScreenshotConfig("error_reopen.json")],
|
|
||||||
"opencollective": [ScreenshotConfig("one_time_donation.json")],
|
"opencollective": [ScreenshotConfig("one_time_donation.json")],
|
||||||
"opsgenie": [ScreenshotConfig("addrecipient.json", image_name="000.png")],
|
"opsgenie": [ScreenshotConfig("addrecipient.json", image_name="000.png")],
|
||||||
"pagerduty": [ScreenshotConfig("trigger_v2.json")],
|
"pagerduty": [ScreenshotConfig("trigger_v2.json")],
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
Get Zulip notifications for your Opbeat events!
|
|
||||||
|
|
||||||
1. {!create-channel.md!}
|
|
||||||
|
|
||||||
1. {!create-an-incoming-webhook.md!}
|
|
||||||
|
|
||||||
1. {!generate-integration-url.md!}
|
|
||||||
|
|
||||||
1. Go to your Opbeat **Organization Settings**.
|
|
||||||
|
|
||||||
1. Under **HTTP Hook (Experimental)**, set **Hook target**
|
|
||||||
to the URL constructed above, and click **Save settings**.
|
|
||||||
|
|
||||||
{!congrats.md!}
|
|
||||||
|
|
||||||
![](/static/images/integrations/opbeat/001.png)
|
|
|
@ -1,122 +0,0 @@
|
||||||
{
|
|
||||||
"id": "bf991a45d9184b0ca6fb3d48d3db4c38",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/activities/bf991a45d9184b0ca6fb3d48d3db4c38",
|
|
||||||
"html_url": "https://opbeat.com/test_org/test-flask-app/errors/2/#activity-bf991a45d9184b0ca6fb3d48d3db4c38",
|
|
||||||
"author": {
|
|
||||||
"id": "5802edc6e84b4843b23edff00c6d300a",
|
|
||||||
"legacy_id": 14883,
|
|
||||||
"first_name": "foo",
|
|
||||||
"last_name": "E",
|
|
||||||
"email": "ivchepro@gmail.com",
|
|
||||||
"avatar": {
|
|
||||||
"40": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=40",
|
|
||||||
"80": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=80",
|
|
||||||
"180": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=180",
|
|
||||||
"240": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=240",
|
|
||||||
"120": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=120"
|
|
||||||
},
|
|
||||||
"html_url": "https://opbeat.com/account/settings/",
|
|
||||||
"type_name": "user"
|
|
||||||
},
|
|
||||||
"created": "2017-12-10T18:15:07Z",
|
|
||||||
"occurred": "2017-12-10T18:15:07Z",
|
|
||||||
"title": "foo marked E#2 as fixed",
|
|
||||||
"summary": "foo marked the error group as fixed",
|
|
||||||
"organization": {
|
|
||||||
"id": "f9a77c5e6b044c2686612539fe4a3a6f",
|
|
||||||
"name": "test_org",
|
|
||||||
"short_name": "test_org",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f",
|
|
||||||
"type_name": "organization"
|
|
||||||
},
|
|
||||||
"app": {
|
|
||||||
"id": "53daf84bfc",
|
|
||||||
"name": "Test-flask-app",
|
|
||||||
"short_name": "test-flask-app",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc",
|
|
||||||
"type_name": "app"
|
|
||||||
},
|
|
||||||
"subject_type": "errorgroup",
|
|
||||||
"subject": {
|
|
||||||
"id": "eac027998bc44fb0b2f6269eb0ab0418",
|
|
||||||
"number": 2,
|
|
||||||
"created": "2017-12-10T17:52:48Z",
|
|
||||||
"first_seen": "2017-12-10T17:52:47Z",
|
|
||||||
"last_seen": "2017-12-10T18:07:55Z",
|
|
||||||
"times_seen": {
|
|
||||||
"this_release": 10,
|
|
||||||
"total": 10,
|
|
||||||
"24h": 10.0,
|
|
||||||
"72h": 10.0
|
|
||||||
},
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418",
|
|
||||||
"html_url": "https://opbeat.com/test_org/test-flask-app/errors/2/",
|
|
||||||
"links": {
|
|
||||||
"activities": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/activities",
|
|
||||||
"undo-mark-as-fixed": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-mark-fixed",
|
|
||||||
"mark-as-temporarily-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/temporarily-ignore",
|
|
||||||
"comments": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/comments",
|
|
||||||
"mark-as-fixed": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/mark-fixed",
|
|
||||||
"assignable-users": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/assignable-users",
|
|
||||||
"undo-mark-as-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-ignore",
|
|
||||||
"mark-as-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/ignore",
|
|
||||||
"undo-mark-as-temporarily-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-temporarily-ignore",
|
|
||||||
"assign": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/assign"
|
|
||||||
},
|
|
||||||
"last_occurrence": {
|
|
||||||
"id": "24210da90e5b4d659965b2e3ebf360f4",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"culprit": "",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"logger": "__main__",
|
|
||||||
"client_supplied_id": "13a4410d11724b30af92cd6ef1d556e8",
|
|
||||||
"extra": {
|
|
||||||
"thread": "140621113497408",
|
|
||||||
"process": "6120",
|
|
||||||
"threadName": "MainThread",
|
|
||||||
"stack_info": "None",
|
|
||||||
"module": "app",
|
|
||||||
"funcName": "foo",
|
|
||||||
"processName": "MainProcess",
|
|
||||||
"pathname": "app.py",
|
|
||||||
"lineno": "17",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"filename": "app.py"
|
|
||||||
},
|
|
||||||
"type_name": "errorlog"
|
|
||||||
},
|
|
||||||
"resolved_state": "fixed",
|
|
||||||
"allowed_resolve_transitions": [
|
|
||||||
"undo-mark-as-fixed",
|
|
||||||
"mark-as-regression"
|
|
||||||
],
|
|
||||||
"is_alarm": false,
|
|
||||||
"num_comments": 4,
|
|
||||||
"is_expired": false,
|
|
||||||
"type_name": "errorgroup",
|
|
||||||
"first_error": {
|
|
||||||
"id": "24210da90e5b4d659965b2e3ebf360f4",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"culprit": "",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"logger": "__main__",
|
|
||||||
"client_supplied_id": "13a4410d11724b30af92cd6ef1d556e8",
|
|
||||||
"extra": {
|
|
||||||
"thread": "140621113497408",
|
|
||||||
"process": "6120",
|
|
||||||
"threadName": "MainThread",
|
|
||||||
"stack_info": "None",
|
|
||||||
"module": "app",
|
|
||||||
"funcName": "foo",
|
|
||||||
"processName": "MainProcess",
|
|
||||||
"pathname": "app.py",
|
|
||||||
"lineno": "17",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"filename": "app.py"
|
|
||||||
},
|
|
||||||
"type_name": "errorlog"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"action": "fixed",
|
|
||||||
"type_name": "activity"
|
|
||||||
}
|
|
|
@ -1,123 +0,0 @@
|
||||||
{
|
|
||||||
"id": "38a556dfc0b04a59a586359bbce1463d",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/activities/38a556dfc0b04a59a586359bbce1463d",
|
|
||||||
"html_url": "https://opbeat.com/test_org/test-flask-app/errors/2/#activity-38a556dfc0b04a59a586359bbce1463d",
|
|
||||||
"author": {
|
|
||||||
"id": "5802edc6e84b4843b23edff00c6d300a",
|
|
||||||
"legacy_id": 14883,
|
|
||||||
"first_name": "foo",
|
|
||||||
"last_name": "E",
|
|
||||||
"email": "ivchepro@gmail.com",
|
|
||||||
"avatar": {
|
|
||||||
"40": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=40",
|
|
||||||
"80": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=80",
|
|
||||||
"180": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=180",
|
|
||||||
"240": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=240",
|
|
||||||
"120": "https://secure.gravatar.com/avatar/cf936cf5a05314e692830f4d17ec434e?d=https%3A%2F%2Fopbeat.com%2Fstatic%2Fimages%2Fcommon%2Favatars%2Favatar_default_user.png&size=120"
|
|
||||||
},
|
|
||||||
"html_url": "https://opbeat.com/account/settings/",
|
|
||||||
"type_name": "user"
|
|
||||||
},
|
|
||||||
"created": "2017-12-10T18:15:39Z",
|
|
||||||
"occurred": "2017-12-10T18:15:39Z",
|
|
||||||
"title": "foo reopened E#2",
|
|
||||||
"summary": "foo reopened the error group",
|
|
||||||
"organization": {
|
|
||||||
"id": "f9a77c5e6b044c2686612539fe4a3a6f",
|
|
||||||
"name": "test_org",
|
|
||||||
"short_name": "test_org",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f",
|
|
||||||
"type_name": "organization"
|
|
||||||
},
|
|
||||||
"app": {
|
|
||||||
"id": "53daf84bfc",
|
|
||||||
"name": "Test-flask-app",
|
|
||||||
"short_name": "test-flask-app",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc",
|
|
||||||
"type_name": "app"
|
|
||||||
},
|
|
||||||
"subject_type": "errorgroup",
|
|
||||||
"subject": {
|
|
||||||
"id": "eac027998bc44fb0b2f6269eb0ab0418",
|
|
||||||
"number": 2,
|
|
||||||
"created": "2017-12-10T17:52:48Z",
|
|
||||||
"first_seen": "2017-12-10T17:52:47Z",
|
|
||||||
"last_seen": "2017-12-10T18:07:55Z",
|
|
||||||
"times_seen": {
|
|
||||||
"this_release": 10,
|
|
||||||
"total": 10,
|
|
||||||
"24h": 10.0,
|
|
||||||
"72h": 10.0
|
|
||||||
},
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418",
|
|
||||||
"html_url": "https://opbeat.com/test_org/test-flask-app/errors/2/",
|
|
||||||
"links": {
|
|
||||||
"activities": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/activities",
|
|
||||||
"undo-mark-as-fixed": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-mark-fixed",
|
|
||||||
"mark-as-temporarily-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/temporarily-ignore",
|
|
||||||
"comments": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/comments",
|
|
||||||
"mark-as-fixed": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/mark-fixed",
|
|
||||||
"assignable-users": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/assignable-users",
|
|
||||||
"undo-mark-as-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-ignore",
|
|
||||||
"mark-as-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/ignore",
|
|
||||||
"undo-mark-as-temporarily-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-temporarily-ignore",
|
|
||||||
"assign": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/assign"
|
|
||||||
},
|
|
||||||
"last_occurrence": {
|
|
||||||
"id": "24210da90e5b4d659965b2e3ebf360f4",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"culprit": "",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"logger": "__main__",
|
|
||||||
"client_supplied_id": "13a4410d11724b30af92cd6ef1d556e8",
|
|
||||||
"extra": {
|
|
||||||
"thread": "140621113497408",
|
|
||||||
"process": "6120",
|
|
||||||
"threadName": "MainThread",
|
|
||||||
"stack_info": "None",
|
|
||||||
"module": "app",
|
|
||||||
"funcName": "foo",
|
|
||||||
"processName": "MainProcess",
|
|
||||||
"pathname": "app.py",
|
|
||||||
"lineno": "17",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"filename": "app.py"
|
|
||||||
},
|
|
||||||
"type_name": "errorlog"
|
|
||||||
},
|
|
||||||
"resolved_state": "open",
|
|
||||||
"allowed_resolve_transitions": [
|
|
||||||
"mark-as-temporarily-ignored",
|
|
||||||
"mark-as-fixed",
|
|
||||||
"mark-as-ignored"
|
|
||||||
],
|
|
||||||
"is_alarm": false,
|
|
||||||
"num_comments": 4,
|
|
||||||
"is_expired": false,
|
|
||||||
"type_name": "errorgroup",
|
|
||||||
"first_error": {
|
|
||||||
"id": "24210da90e5b4d659965b2e3ebf360f4",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"culprit": "",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"logger": "__main__",
|
|
||||||
"client_supplied_id": "13a4410d11724b30af92cd6ef1d556e8",
|
|
||||||
"extra": {
|
|
||||||
"thread": "140621113497408",
|
|
||||||
"process": "6120",
|
|
||||||
"threadName": "MainThread",
|
|
||||||
"stack_info": "None",
|
|
||||||
"module": "app",
|
|
||||||
"funcName": "foo",
|
|
||||||
"processName": "MainProcess",
|
|
||||||
"pathname": "app.py",
|
|
||||||
"lineno": "17",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"filename": "app.py"
|
|
||||||
},
|
|
||||||
"type_name": "errorlog"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"action": "reopened",
|
|
||||||
"type_name": "activity"
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
{
|
|
||||||
"id": "47f1f10158d94cbf93a0b539abc64b0f",
|
|
||||||
"html_url": null,
|
|
||||||
"title": "foo",
|
|
||||||
"summary": "App foo created",
|
|
||||||
"organization": {
|
|
||||||
"id": "27a4c0633f5c4a24a15a8896754145c4",
|
|
||||||
"name": "bar",
|
|
||||||
"short_name": "bar",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/27a4c0633f5c4a24a15a8896754145c4",
|
|
||||||
"type_name": "organization"
|
|
||||||
},
|
|
||||||
"app": {
|
|
||||||
"id": "bdb4751769",
|
|
||||||
"name": "foo",
|
|
||||||
"short_name": "foo",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/27a4c0633f5c4a24a15a8896754145c4/apps/bdb4751769",
|
|
||||||
"type_name": "app"
|
|
||||||
},
|
|
||||||
"subject_type": "app",
|
|
||||||
"subject": {
|
|
||||||
"id": "bdb4751769",
|
|
||||||
"created": "2018-01-03T11:16:49Z",
|
|
||||||
"name": "foo",
|
|
||||||
"short_name": "foo",
|
|
||||||
"settings": null,
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/27a4c0633f5c4a24a15a8896754145c4/apps/bdb4751769",
|
|
||||||
"html_url": "/bar/foo/",
|
|
||||||
"has_unread_notifications": false,
|
|
||||||
"has_metrics_available": false,
|
|
||||||
"language": "nodejs",
|
|
||||||
"framework": "custom",
|
|
||||||
"type_name": "app"
|
|
||||||
},
|
|
||||||
"action": "created",
|
|
||||||
"type_name": "activity"
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
{
|
|
||||||
"id": "5df00003ea4e42458db48446692f6d37",
|
|
||||||
"html_url": "https://opbeat.com/foo/test-flask-app/errors/2/#activity-5df00003ea4e42458db48446692f6d37",
|
|
||||||
"author": {
|
|
||||||
"first_name": "foo",
|
|
||||||
"last_name": "bar"
|
|
||||||
},
|
|
||||||
"title": "foo commented on E#2",
|
|
||||||
"summary": "test comment",
|
|
||||||
"subject_type": "comment",
|
|
||||||
"subject": {
|
|
||||||
"id": "ca45bf96cd674b3eaa914251f0a08773",
|
|
||||||
"text": "test comment",
|
|
||||||
"author": {
|
|
||||||
"id": "5802edc6e84b4843b23edff00c6d300a",
|
|
||||||
"first_name": "foo",
|
|
||||||
"last_name": "barE"
|
|
||||||
},
|
|
||||||
"html_url": "https://opbeat.com/foo/test-flask-app/errors/2/#activity-5df00003ea4e42458db48446692f6d37",
|
|
||||||
"subject_type": "errorgroup",
|
|
||||||
"subject": {
|
|
||||||
"id": "eac027998bc44fb0b2f6269eb0ab0418",
|
|
||||||
"number": 2,
|
|
||||||
"html_url": "https://opbeat.com/foo/test-flask-app/errors/2/",
|
|
||||||
"last_occurrence": {
|
|
||||||
"id": "24210da90e5b4d659965b2e3ebf360f4",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"culprit": "",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"logger": "__main__",
|
|
||||||
"client_supplied_id": "13a4410d11724b30af92cd6ef1d556e8",
|
|
||||||
"extra": {
|
|
||||||
"module": "app",
|
|
||||||
"funcName": "foo",
|
|
||||||
"processName": "MainProcess",
|
|
||||||
"pathname": "app.py",
|
|
||||||
"lineno": "17",
|
|
||||||
"message": "A warning occurred (42 apples)"
|
|
||||||
},
|
|
||||||
"type_name": "errorlog"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type_name": "comment"
|
|
||||||
},
|
|
||||||
"action": "created",
|
|
||||||
"type_name": "activity"
|
|
||||||
}
|
|
|
@ -1,107 +0,0 @@
|
||||||
{
|
|
||||||
"id": "c0396f38323a4fa7b314f87d5ed9cdd2",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/activities/c0396f38323a4fa7b314f87d5ed9cdd2",
|
|
||||||
"html_url": "https://opbeat.com/test_org/test-flask-app/errors/2/#activity-c0396f38323a4fa7b314f87d5ed9cdd2",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"occurred": "2017-12-10T18:07:55Z",
|
|
||||||
"title": "E#2 regressed",
|
|
||||||
"summary": "The error group regressed",
|
|
||||||
"organization": {
|
|
||||||
"id": "f9a77c5e6b044c2686612539fe4a3a6f",
|
|
||||||
"name": "test_org",
|
|
||||||
"short_name": "test_org",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f",
|
|
||||||
"type_name": "organization"
|
|
||||||
},
|
|
||||||
"app": {
|
|
||||||
"id": "53daf84bfc",
|
|
||||||
"name": "Test-flask-app",
|
|
||||||
"short_name": "test-flask-app",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc",
|
|
||||||
"type_name": "app"
|
|
||||||
},
|
|
||||||
"subject_type": "errorgroup",
|
|
||||||
"subject": {
|
|
||||||
"id": "eac027998bc44fb0b2f6269eb0ab0418",
|
|
||||||
"number": 2,
|
|
||||||
"created": "2017-12-10T17:52:48Z",
|
|
||||||
"first_seen": "2017-12-10T17:52:47Z",
|
|
||||||
"last_seen": "2017-12-10T17:58:20Z",
|
|
||||||
"times_seen": {
|
|
||||||
"this_release": 10,
|
|
||||||
"total": 9,
|
|
||||||
"24h": 10.0,
|
|
||||||
"72h": 10.0
|
|
||||||
},
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418",
|
|
||||||
"html_url": "https://opbeat.com/test_org/test-flask-app/errors/2/",
|
|
||||||
"links": {
|
|
||||||
"activities": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/activities",
|
|
||||||
"undo-mark-as-fixed": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-mark-fixed",
|
|
||||||
"mark-as-temporarily-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/temporarily-ignore",
|
|
||||||
"comments": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/comments",
|
|
||||||
"mark-as-fixed": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/mark-fixed",
|
|
||||||
"assignable-users": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/assignable-users",
|
|
||||||
"undo-mark-as-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-ignore",
|
|
||||||
"mark-as-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/ignore",
|
|
||||||
"undo-mark-as-temporarily-ignored": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/undo-temporarily-ignore",
|
|
||||||
"assign": "https://opbeat.com/api/v2/organizations/f9a77c5e6b044c2686612539fe4a3a6f/apps/53daf84bfc/errorgroups/eac027998bc44fb0b2f6269eb0ab0418/actions/assign"
|
|
||||||
},
|
|
||||||
"last_occurrence": {
|
|
||||||
"id": "24210da90e5b4d659965b2e3ebf360f4",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"culprit": "",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"logger": "__main__",
|
|
||||||
"client_supplied_id": "13a4410d11724b30af92cd6ef1d556e8",
|
|
||||||
"extra": {
|
|
||||||
"thread": "140621113497408",
|
|
||||||
"process": "6120",
|
|
||||||
"threadName": "MainThread",
|
|
||||||
"stack_info": "None",
|
|
||||||
"module": "app",
|
|
||||||
"funcName": "foo",
|
|
||||||
"processName": "MainProcess",
|
|
||||||
"pathname": "app.py",
|
|
||||||
"lineno": "17",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"filename": "app.py"
|
|
||||||
},
|
|
||||||
"type_name": "errorlog"
|
|
||||||
},
|
|
||||||
"resolved_state": "regressed",
|
|
||||||
"allowed_resolve_transitions": [
|
|
||||||
"mark-as-temporarily-ignored",
|
|
||||||
"mark-as-fixed",
|
|
||||||
"mark-as-ignored"
|
|
||||||
],
|
|
||||||
"is_alarm": false,
|
|
||||||
"num_comments": 3,
|
|
||||||
"is_expired": false,
|
|
||||||
"type_name": "errorgroup",
|
|
||||||
"first_error": {
|
|
||||||
"id": "24210da90e5b4d659965b2e3ebf360f4",
|
|
||||||
"created": "2017-12-10T18:07:55Z",
|
|
||||||
"culprit": "",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"logger": "__main__",
|
|
||||||
"client_supplied_id": "13a4410d11724b30af92cd6ef1d556e8",
|
|
||||||
"extra": {
|
|
||||||
"thread": "140621113497408",
|
|
||||||
"process": "6120",
|
|
||||||
"threadName": "MainThread",
|
|
||||||
"stack_info": "None",
|
|
||||||
"module": "app",
|
|
||||||
"funcName": "foo",
|
|
||||||
"processName": "MainProcess",
|
|
||||||
"pathname": "app.py",
|
|
||||||
"lineno": "17",
|
|
||||||
"message": "A warning occurred (42 apples)",
|
|
||||||
"filename": "app.py"
|
|
||||||
},
|
|
||||||
"type_name": "errorlog"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"action": "regressed",
|
|
||||||
"type_name": "activity"
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
{
|
|
||||||
"id": "47f1f10158d94cbf93a0b539abc64b0f",
|
|
||||||
"html_url": null,
|
|
||||||
"title": "test title",
|
|
||||||
"summary": "test summary",
|
|
||||||
"organization": {
|
|
||||||
"id": "27a4c0633f5c4a24a15a8896754145c4",
|
|
||||||
"name": "bar",
|
|
||||||
"short_name": "bar",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/27a4c0633f5c4a24a15a8896754145c4",
|
|
||||||
"type_name": "organization"
|
|
||||||
},
|
|
||||||
"app": {
|
|
||||||
"id": "bdb4751769",
|
|
||||||
"name": "foo",
|
|
||||||
"short_name": "foo",
|
|
||||||
"url": "https://opbeat.com/api/v2/organizations/27a4c0633f5c4a24a15a8896754145c4/apps/bdb4751769",
|
|
||||||
"type_name": "app"
|
|
||||||
},
|
|
||||||
"subject_type": "foo",
|
|
||||||
"subject": {
|
|
||||||
"id": "bdb4751769",
|
|
||||||
"created": "2018-01-03T11:16:49Z",
|
|
||||||
"name": "foo",
|
|
||||||
"short_name": "foo",
|
|
||||||
"settings": null
|
|
||||||
},
|
|
||||||
"action": "created",
|
|
||||||
"type_name": "activity"
|
|
||||||
}
|
|
|
@ -1,99 +0,0 @@
|
||||||
from zerver.lib.test_classes import WebhookTestCase
|
|
||||||
from zerver.lib.validator import wrap_wild_value
|
|
||||||
from zerver.webhooks.opbeat.view import get_value
|
|
||||||
|
|
||||||
|
|
||||||
class OpbeatHookTests(WebhookTestCase):
|
|
||||||
CHANNEL_NAME = "opbeat"
|
|
||||||
URL_TEMPLATE = "/api/v1/external/opbeat?api_key={api_key}&stream={stream}"
|
|
||||||
WEBHOOK_DIR_NAME = "opbeat"
|
|
||||||
|
|
||||||
def test_comment(self) -> None:
|
|
||||||
expected_topic_name = "foo commented on E#2"
|
|
||||||
expected_message = """\
|
|
||||||
**[foo commented on E#2](https://opbeat.com/foo/test-flask-app/errors/2/#activity-5df00003ea4e42458db48446692f6d37)**
|
|
||||||
test comment
|
|
||||||
|
|
||||||
|
|
||||||
**[E#2](https://opbeat.com/foo/test-flask-app/errors/2/)**
|
|
||||||
|
|
||||||
>**Most recent Occurrence**
|
|
||||||
>in app.py
|
|
||||||
>A warning occurred (42 apples)"""
|
|
||||||
self.check_webhook(
|
|
||||||
"new_comment", expected_topic_name, expected_message, content_type="application/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_new_app(self) -> None:
|
|
||||||
expected_topic_name = "foo"
|
|
||||||
expected_message = """\
|
|
||||||
**foo**
|
|
||||||
App foo created
|
|
||||||
|
|
||||||
**[foo](https://opbeat.com/bar/foo/)**
|
|
||||||
>language: nodejs
|
|
||||||
>framework: custom"""
|
|
||||||
self.check_webhook(
|
|
||||||
"new_app", expected_topic_name, expected_message, content_type="application/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_get_empty_value(self) -> None:
|
|
||||||
test_dictionary = wrap_wild_value("test_dictionary", {"key": "value"})
|
|
||||||
self.assertEqual(get_value(test_dictionary, "foo"), "")
|
|
||||||
|
|
||||||
def test_no_subject_type(self) -> None:
|
|
||||||
expected_topic_name = "test title"
|
|
||||||
expected_message = """\
|
|
||||||
**test title**
|
|
||||||
test summary"""
|
|
||||||
self.check_webhook(
|
|
||||||
"unsupported_object",
|
|
||||||
expected_topic_name,
|
|
||||||
expected_message,
|
|
||||||
content_type="application/json",
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_error_fixed(self) -> None:
|
|
||||||
expected_topic_name = "foo marked E#2 as fixed"
|
|
||||||
expected_message = """\
|
|
||||||
**[foo marked E#2 as fixed](https://opbeat.com/test_org/test-flask-app/errors/2/#activity-bf991a45d9184b0ca6fb3d48d3db4c38)**
|
|
||||||
foo marked the error group as fixed
|
|
||||||
|
|
||||||
**[E#2](https://opbeat.com/test_org/test-flask-app/errors/2/)**
|
|
||||||
|
|
||||||
>**Most recent Occurrence**
|
|
||||||
>in app.py
|
|
||||||
>A warning occurred (42 apples)"""
|
|
||||||
self.check_webhook(
|
|
||||||
"error_fixed", expected_topic_name, expected_message, content_type="application/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_error_reopened(self) -> None:
|
|
||||||
expected_topic_name = "foo reopened E#2"
|
|
||||||
expected_message = """\
|
|
||||||
**[foo reopened E#2](https://opbeat.com/test_org/test-flask-app/errors/2/#activity-38a556dfc0b04a59a586359bbce1463d)**
|
|
||||||
foo reopened the error group
|
|
||||||
|
|
||||||
**[E#2](https://opbeat.com/test_org/test-flask-app/errors/2/)**
|
|
||||||
|
|
||||||
>**Most recent Occurrence**
|
|
||||||
>in app.py
|
|
||||||
>A warning occurred (42 apples)"""
|
|
||||||
self.check_webhook(
|
|
||||||
"error_reopen", expected_topic_name, expected_message, content_type="application/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_error_regressed(self) -> None:
|
|
||||||
expected_topic_name = "E#2 regressed"
|
|
||||||
expected_message = """\
|
|
||||||
**[E#2 regressed](https://opbeat.com/test_org/test-flask-app/errors/2/#activity-c0396f38323a4fa7b314f87d5ed9cdd2)**
|
|
||||||
The error group regressed
|
|
||||||
|
|
||||||
**[E#2](https://opbeat.com/test_org/test-flask-app/errors/2/)**
|
|
||||||
|
|
||||||
>**Most recent Occurrence**
|
|
||||||
>in app.py
|
|
||||||
>A warning occurred (42 apples)"""
|
|
||||||
self.check_webhook(
|
|
||||||
"new_error", expected_topic_name, expected_message, content_type="application/json"
|
|
||||||
)
|
|
|
@ -1,121 +0,0 @@
|
||||||
# Webhooks for external integrations.
|
|
||||||
|
|
||||||
from django.http import HttpRequest, HttpResponse
|
|
||||||
|
|
||||||
from zerver.decorator import webhook_view
|
|
||||||
from zerver.lib.response import json_success
|
|
||||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
|
||||||
from zerver.lib.validator import WildValue, check_int, check_none_or, check_string, check_union
|
|
||||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
|
||||||
from zerver.models import UserProfile
|
|
||||||
|
|
||||||
subject_types: dict[str, list[list[str]]] = {
|
|
||||||
"app": [ # Object type name
|
|
||||||
["name"], # Title
|
|
||||||
["html_url"], # Automatically put into title
|
|
||||||
["language"], # Other properties.
|
|
||||||
["framework"],
|
|
||||||
],
|
|
||||||
"base": [
|
|
||||||
["title"],
|
|
||||||
["html_url"],
|
|
||||||
["#summary"],
|
|
||||||
["subject"],
|
|
||||||
],
|
|
||||||
"comment": [
|
|
||||||
[""],
|
|
||||||
["subject"],
|
|
||||||
],
|
|
||||||
"errorgroup": [
|
|
||||||
["E#{}", "number"],
|
|
||||||
["html_url"],
|
|
||||||
["last_occurrence:error"],
|
|
||||||
],
|
|
||||||
"error": [
|
|
||||||
[""],
|
|
||||||
['">**Most recent Occurrence**'],
|
|
||||||
["in {}", "extra/pathname"],
|
|
||||||
["!message"],
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def get_value(_obj: WildValue, key: str) -> str:
|
|
||||||
for _key in key.lstrip("!").split("/"):
|
|
||||||
if _key in _obj:
|
|
||||||
_obj = _obj[_key]
|
|
||||||
else:
|
|
||||||
return ""
|
|
||||||
return str(_obj.tame(check_union([check_string, check_int])))
|
|
||||||
|
|
||||||
|
|
||||||
def format_object(
|
|
||||||
obj: WildValue,
|
|
||||||
subject_type: str,
|
|
||||||
message: str,
|
|
||||||
) -> str:
|
|
||||||
if subject_type not in subject_types:
|
|
||||||
return message
|
|
||||||
keys: list[list[str]] = subject_types[subject_type][1:]
|
|
||||||
title = subject_types[subject_type][0]
|
|
||||||
if title[0] != "":
|
|
||||||
title_str = ""
|
|
||||||
if len(title) > 1:
|
|
||||||
title_str = title[0].format(get_value(obj, title[1]))
|
|
||||||
else:
|
|
||||||
title_str = obj[title[0]].tame(check_string)
|
|
||||||
|
|
||||||
url = obj["html_url"].tame(check_none_or(check_string))
|
|
||||||
if url is not None:
|
|
||||||
if "opbeat.com" not in url:
|
|
||||||
url = "https://opbeat.com/" + url.lstrip("/")
|
|
||||||
message += f"\n**[{title_str}]({url})**"
|
|
||||||
else:
|
|
||||||
message += f"\n**{title_str}**"
|
|
||||||
for key_list in keys:
|
|
||||||
if len(key_list) > 1:
|
|
||||||
value = key_list[0].format(get_value(obj, key_list[1]))
|
|
||||||
message += f"\n>{value}"
|
|
||||||
else:
|
|
||||||
key = key_list[0]
|
|
||||||
key_raw = key.lstrip("!").lstrip("#").lstrip('"')
|
|
||||||
if key_raw not in {"html_url", "subject"} and ":" not in key_raw:
|
|
||||||
value = get_value(obj, key_raw)
|
|
||||||
if key.startswith("!"):
|
|
||||||
message += f"\n>{value}"
|
|
||||||
elif key.startswith("#"):
|
|
||||||
message += f"\n{value}"
|
|
||||||
elif key.startswith('"'):
|
|
||||||
message += f"\n{key_raw}"
|
|
||||||
else:
|
|
||||||
message += f"\n>{key}: {value}"
|
|
||||||
if key == "subject":
|
|
||||||
message = format_object(
|
|
||||||
obj["subject"], obj["subject_type"].tame(check_string), message + "\n"
|
|
||||||
)
|
|
||||||
if ":" in key:
|
|
||||||
value, value_type = key.split(":")
|
|
||||||
message = format_object(obj[value], value_type, message + "\n")
|
|
||||||
return message
|
|
||||||
|
|
||||||
|
|
||||||
@webhook_view("Opbeat")
|
|
||||||
@typed_endpoint
|
|
||||||
def api_opbeat_webhook(
|
|
||||||
request: HttpRequest,
|
|
||||||
user_profile: UserProfile,
|
|
||||||
*,
|
|
||||||
payload: JsonBodyPayload[WildValue],
|
|
||||||
) -> HttpResponse:
|
|
||||||
"""
|
|
||||||
This uses the subject name from opbeat to make the topic,
|
|
||||||
and the summary from Opbeat as the message body, with
|
|
||||||
details about the object mentioned.
|
|
||||||
"""
|
|
||||||
|
|
||||||
topic_name = payload["title"].tame(check_string)
|
|
||||||
|
|
||||||
message = format_object(payload, "base", "")
|
|
||||||
|
|
||||||
check_send_webhook_message(request, user_profile, topic_name, message)
|
|
||||||
return json_success(request)
|
|
Loading…
Reference in New Issue