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("netlify", ["continuous-integration", "deployment"], display_name="Netlify"),
|
||||
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("opsgenie", ["meta-integration", "monitoring"]),
|
||||
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_closed_new.json", "003.png"),
|
||||
],
|
||||
"opbeat": [ScreenshotConfig("error_reopen.json")],
|
||||
"opencollective": [ScreenshotConfig("one_time_donation.json")],
|
||||
"opsgenie": [ScreenshotConfig("addrecipient.json", image_name="000.png")],
|
||||
"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