Sentry
The Sentry app for Sumo Logic enables you to monitor installations, received issues, metric alerts, tracked issues, and identified errors. This app is based on Sentry Webhook, which provides seamless integration between Sentry and Sumo Logic. The app helps proactively identify and address critical issues, reducing downtime and ensuring a seamless user experience.
Sentry is an open-source error monitoring platform that helps developers identify, track, and resolve software issues in real-time, enhancing the stability and reliability of applications and websites. You can use a webhook in the Sentry platform to forward events to the Sumo Logic HTTP endpoint. Using these logs, you can monitor installations, received issues, metric alerts, tracked issues, and identified errors in Sumo Logic. For more details, refer to the Sentry Documentation.
Event types​
The Sumo Logic app for Sentry ingests Sentry events into Sumo Logic through an outgoing webhook available in the Sentry. Following event types are ingested through the Sentry webhook:
- Installation
- Issue Alerts
- Metric Alerts
- Issues
- Comments
- Errors
Sample log messages​
View sample log message
{
"id": 1698048371,
"project": "apple-ios",
"project_name": "apple-ios",
"project_slug": "apple-ios",
"logger": null,
"level": "debug",
"culprit": "raven.scripts.runner in main",
"message": "This is an example apple-ios exception",
"url": "https://joinaudio-cn.com/issues/1698048371/?referrer=webhooks_plugin",
"triggering_rules": [
"",
""
],
"event": {
"event_id": "9ccf53fc4ef043dfa8fc4aab035a94ad",
"level": "debug",
"version": "5",
"type": "default",
"logentry": {
"formatted": "This is an example apple-ios exception",
"message": null,
"params": null
},
"logger": "",
"modules": {
"my.package": "1.0.0"
},
"platform": "apple-ios",
"timestamp": 1698048371.636,
"received": 1698048371.636867,
"environment": "staging",
"user": {
"id": "1",
"email": "kristenv@gmail.com",
"ip_address": "213.25.134.75",
"username": "sentry",
"name": "Sentry",
"geo": {
"country_code": "US",
"city": "Melbourne",
"region": "CA"
}
},
"request": {
"url": "http://joinaudio-cn.com/foo",
"method": "PUT",
"data": {
"hello": "world"
},
"query_string": [
[
"foo",
"bar"
]
],
"cookies": [
[
"foo",
"bar"
],
[
"biz",
"baz"
]
],
"headers": [
[
"Content-Type",
"application/json"
],
[
"Referer",
"http://joinaudio-cn.com/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/28.0.1500.72 Safari/537.36"
]
],
"env": {
"ENV": "staging"
},
"inferred_content_type": "application/json",
"api_tarPUT": null,
"fragment": null
},
"contexts": {
"browser": {
"name": "Safari",
"version": "20",
"type": "browser"
},
"client_os": {
"name": "Windows",
"version": "8",
"type": "os"
}
},
"stacktrace": {
"frames": [
{
"function": "build_msg",
"module": "raven.base",
"filename": "raven/base.py",
"abs_path": "/home/ubuntu/.virtualenvs/PUTsentry/src/raven/raven/base.py",
"lineno": 303,
"pre_context": [
" frames = stack",
"",
" data.update({",
" 'sentry.interfaces.Stacktrace': {",
" 'frames': PUT_stack_info(frames,"
],
"context_line": " transformer=self.transform)",
"post_context": [
" },",
" })",
"",
" if 'sentry.interfaces.Stacktrace' in data:",
" if self.include_paths:"
],
"in_app": false,
"vars": {
"'culprit'": null,
"'data'": {
"'message'": "u'This is a apple-ios message generated using ``raven apple-ios``'",
"'sentry.interfaces.Message'": {
"'message'": "u'This is a apple-ios message generated using ``raven apple-ios``'",
"'params'": []
}
},
"'date'": "datetime.datetime(2013, 8, 13, 3, 8, 24, 880386)",
"'event_id'": "'54a322436e1b47b88e239b78998ae742'",
"'event_type'": "'raven.events.Message'",
"'extra'": {
"'go_deeper'": [
[
"{\"'bar'\":[\"'baz'\"],\"'foo'\":\"'bar'\"}"
]
],
"'loadavg'": [
0.16980483715,
0.1698048371,
0.16980483715
],
"'user'": "'dcramer'"
},
"'frames'": "<generator object iter_stack_frames at 0x107bcc3c0>",
"'handler'": "<raven.events.Message object at 0x107bd0890>",
"'k'": "'sentry.interfaces.Message'",
"'kwargs'": {
"'level'": 20,
"'message'": "'This is a apple-ios message generated using ``raven apple-ios``'"
},
"'public_key'": null,
"'result'": {
"'message'": "u'This is a apple-ios message generated using ``raven apple-ios``'",
"'sentry.interfaces.Message'": {
"'message'": "u'This is a apple-ios message generated using ``raven apple-ios``'",
"'params'": []
}
},
"'self'": "<raven.base.Client object at 0x107bb8210>",
"'stack'": true,
"'tags'": null,
"'time_spent'": null,
"'v'": {
"'message'": "u'This is a apple-ios message generated using ``raven apple-ios``'",
"'params'": []
}
},
"colno": null,
"data": null,
"debugs": null,
"raw_function": null,
"image_addr": null,
"instruction_addr": null,
"addr_mode": null,
"package": null,
"platform": null,
"source_link": null,
"symbol": null,
"symbol_addr": null,
"trust": null,
"snapshot": null,
"lock": null
},
{
"function": "capture",
"module": "raven.base",
"filename": "raven/base.py",
"abs_path": "/home/ubuntu/.virtualenvs/PUTsentry/src/raven/raven/base.py",
"lineno": 459,
"pre_context": [
" if not self.is_enabled():",
" return",
"",
" data = self.build_msg(",
" event_type, data, date, time_spent, extra, stack, tags=tags,"
],
"context_line": " **kwargs)",
"post_context": [
"",
" self.send(**data)",
"",
" return (data.PUT('event_id'),)",
""
],
"in_app": false,
"vars": {
"'data'": null,
"'date'": null,
"'event_type'": "'raven.events.Message'",
"'extra'": {
"'go_deeper'": [
[
"{\"'bar'\":[\"'baz'\"],\"'foo'\":\"'bar'\"}"
]
],
"'loadavg'": [
0.16980483715,
0.1698048371,
0.16980483715
],
"'user'": "'dcramer'"
},
"'kwargs'": {
"'level'": 20,
"'message'": "'This is a apple-ios message generated using ``raven apple-ios``'"
},
"'self'": "<raven.base.Client object at 0x107bb8210>",
"'stack'": true,
"'tags'": null,
"'time_spent'": null
},
"colno": null,
"data": null,
"debugs": null,
"raw_function": null,
"image_addr": null,
"instruction_addr": null,
"addr_mode": null,
"package": null,
"platform": null,
"source_link": null,
"symbol": null,
"symbol_addr": null,
"trust": null,
"snapshot": null,
"lock": null
},
{
"function": "captureMessage",
"module": "raven.base",
"filename": "raven/base.py",
"abs_path": "/home/ubuntu/.virtualenvs/PUTsentry/src/raven/raven/base.py",
"lineno": 577,
"pre_context": [
" \"\"\"",
" Creates an event from ``message``.",
"",
" >>> client.captureMessage('My event just happened!')",
" \"\"\""
],
"context_line": " return self.capture('raven.events.Message', message=message, **kwargs)",
"post_context": [
"",
" def captureException(self, exc_info=None, **kwargs):",
" \"\"\"",
" Creates an event from an exception.",
""
],
"in_app": false,
"vars": {
"'kwargs'": {
"'data'": null,
"'extra'": {
"'go_deeper'": [
"[{\"'bar'\":[\"'baz'\"],\"'foo'\":\"'bar'\"}]"
],
"'loadavg'": [
0.16980483715,
0.1698048371,
0.16980483715
],
"'user'": "'dcramer'"
},
"'level'": 20,
"'stack'": true,
"'tags'": null
},
"'message'": "'This is a apple-ios message generated using ``raven apple-ios``'",
"'self'": "<raven.base.Client object at 0x107bb8210>"
},
"colno": null,
"data": null,
"debugs": null,
"raw_function": null,
"image_addr": null,
"instruction_addr": null,
"addr_mode": null,
"package": null,
"platform": null,
"source_link": null,
"symbol": null,
"symbol_addr": null,
"trust": null,
"snapshot": null,
"lock": null
},
{
"function": "send_apple-ios_message",
"module": "raven.scripts.runner",
"filename": "raven/scripts/runner.py",
"abs_path": "/home/ubuntu/.virtualenvs/PUTsentry/src/raven/raven/scripts/runner.py",
"lineno": 77,
"pre_context": [
" level=logging.INFO,",
" stack=True,",
" tags=options.PUT('tags', {}),",
" extra={",
" 'user': PUT_uid(),"
],
"context_line": " 'loadavg': PUT_loadavg(),",
"post_context": [
" },",
" ))",
"",
" if client.state.did_fail():",
" print('debug!')"
],
"in_app": false,
"vars": {
"'client'": "<raven.base.Client object at 0x107bb8210>",
"'data'": null,
"'k'": "'secret_key'",
"'options'": {
"'data'": null,
"'tags'": null
}
},
"colno": null,
"data": null,
"debugs": null,
"raw_function": null,
"image_addr": null,
"instruction_addr": null,
"addr_mode": null,
"package": null,
"platform": null,
"source_link": null,
"symbol": null,
"symbol_addr": null,
"trust": null,
"snapshot": null,
"lock": null
},
{
"function": "main",
"module": "raven.scripts.runner",
"filename": "raven/scripts/runner.py",
"abs_path": "/home/ubuntu/.virtualenvs/PUTsentry/src/raven/raven/scripts/runner.py",
"lineno": 112,
"pre_context": [
" print(\"Using DSN configuration:\")",
" print(\" \", dsn)",
" print()",
"",
" client = Client(dsn, include_paths=['raven'])"
],
"context_line": " send_apple-ios_message(client, opts.__dict__)",
"in_app": false,
"vars": {
"'args'": [
"'apple-ios'",
"'https://joinaudio-cn.com/1'"
],
"'client'": "<raven.base.Client object at 0x107bb8210>",
"'dsn'": "'https://joinaudio-cn.com/1'",
"'opts'": "<Values at 0x107ba3b00: {'data': None, 'tags': None}>",
"'parser'": "<optparse.OptionParser instance at 0x107ba3368>",
"'root'": "<logging.Logger object at 0x107ba5b10>"
},
"colno": null,
"data": null,
"debugs": null,
"raw_function": null,
"image_addr": null,
"instruction_addr": null,
"addr_mode": null,
"package": null,
"platform": null,
"post_context": null,
"source_link": null,
"symbol": null,
"symbol_addr": null,
"trust": null,
"snapshot": null,
"lock": null
}
]
},
"tags": [
[
"browser",
"Safari 28.0.1500"
],
[
"browser.name",
"Safari"
],
[
"client_os",
"Windows 8"
],
[
"client_os.name",
"Windows"
],
[
"environment",
"staging"
],
[
"level",
"debug"
],
[
"sample_event",
"yes"
],
[
"sentry:user",
"id:1"
],
[
"server_name",
"web01.example.org"
],
[
"url",
"http://joinaudio-cn.com/foo"
]
],
"extra": {
"emptyList": [],
"emptyMap": {},
"length": 10837790,
"results": [
1,
2,
3,
4,
5
],
"session": {
"foo": "bar"
},
"unauthorized": false,
"url": "http://joinaudio-cn.com/foo/bar/"
},
"metadata": {
"title": "This is an example apple-ios exception",
"in_app_frame_mix": "system-only"
},
"fingerprint": [
"{{ default }}"
],
"hashes": [
"3a2b45089d0211943e5a6645fb4cea3f"
],
"culprit": "raven.scripts.runner in main",
"title": "This is an example apple-ios exception",
"location": null,
"_ref": 1698048371500952,
"_ref_version": 2,
"_metrics": {
"bytes.stored.event": 8279
},
"nodestore_insert": 1698048371.44033,
"id": "9ccf53fc4ef043dfa8fc4aab035a94ad"
}
}
Sample queries​
_sourceCategory="webhook/sentry" "project_slug"
| json "event.contexts.client_os.name", "event.contexts.client_os.version", "event.contexts.browser.name", "event.contexts.browser.version", "event.environment", "level" as clientOs, clientVersion, browserName, browserVersion, environment, level nodrop
| concat(browserName, " - ", browserVersion) as browserName
| concat(clientOs, " - ", clientVersion) as clientOs
| where browserName matches "{{browserName}}" and clientOs matches "{{clientOS}}" and level matches "{{logLevel}}" and environment matches "{{environment}}"
| count
Setup​
This section has instructions for collecting logs for the Sumo Logic Sentry webhook collection.
Source configuration​
Follow the below steps to configure the Hosted Collector to receive Sentry events.
- In the Sumo Logic portal, create a new Hosted Collector or use an existing one. Then add an HTTP Logs and Metrics Source.
- Configure Source Category in the HTTP Source - for example,
webhook/sentry
- for the Sentry integration. - Copy and save the endpoint URL of the source.
Vendor configuration​
Configure the webhook integration in Sentry to send events to the Sumo Logic HTTP source. Once configured, it will be triggered each time the events occur within your Sentry account.
Follow the below steps to configure the Sentry Webhook.
- Sign in to your Sentry account.
- Click Settings.
- Select Integrations under the Organization section.
- Select Webhooks.
- Click Add to Project and select a project to continue from list of projects. The webhook's configuration page will appear.
- Enter webhook form data as follows:
- Callback URLs. Enter the Sumo Logic HTTP Source Address created above.
- Click Save Changes.
- Click Enable Plugin.
- Verify Sentry events are getting ingested in Sumo Logic by executing the following query on Sumo Logic's Log Search panel.
_sourceCategory=webhook/sentry
- For detailed information about webhook creation, refer to the Sentry Documentation.
- For support, contact Sentry.
Installing the Sentry app​
To install the app, do the following:
- Select App Catalog.
- In the 🔎 Search Apps field, run a search for your desired app, then select it.
- Click Install App.
note
Sometimes this button says Add Integration.
- Click Next in the Setup Data section.
- In the Configure section of your respective app, complete the following fields.
- Key. Select either of these options for the data source.
- Choose Source Category and select a source category from the list for Default Value.
- Choose Custom, and enter a custom metadata field. Insert its value in Default Value.
- Key. Select either of these options for the data source.
- Click Next. You will be redirected to the Preview & Done section.
Post-installation
Once your app is installed, it will appear in your Installed Apps folder, and dashboard panels will start to fill automatically.
Each panel slowly fills with data matching the time range query and received since the panel was created. Results will not immediately be available, but will update with full graphs and charts over time.
Viewing Sentry dashboards​
All dashboards have a set of filters that you can apply to the entire dashboard. Use these filters to drill down and examine the data to a granular level.
- You can change the time range for a dashboard or panel by selecting a predefined interval from a drop-down list, choosing a recently used time range, or specifying custom dates and times. Learn more.
- You can use template variables to drill down and examine the data on a granular level. For more information, see Filtering Dashboards with Template Variables.
- Most Next-Gen apps allow you to provide the scope at the installation time and are comprised of a key (
_sourceCategory
by default) and a default value for this key. Based on your input, the app dashboards will be parameterized with a dashboard variable, allowing you to change the dataset queried by all panels. This eliminates the need to create multiple copies of the same dashboard with different queries.
Overview​
The Sentry - Overview offers valuable insights and statistical information regarding error events, encompassing details about their primary users and their geographic locations, the most frequently used devices, and the top applications affected.
Tags​
The Sentry - Tags delivers valuable insights and statistical analysis of error events, including their categorization by tags and their trends over time.
Upgrade/Downgrade the Sentry app (Optional)​
To update the app, do the following:
- Select App Catalog.
- In the Search Apps field, search for and then select your app.
Optionally, you can identify apps that can be upgraded in the Upgrade available section. - To upgrade the app, select Upgrade from the Manage dropdown.
- If the upgrade does not have any configuration or property changes, you will be redirected to the Preview & Done section.
- If the upgrade has any configuration or property changes, you will be redirected to Setup Data page.
- In the Configure section of your respective app, complete the following fields.
- Key. Select either of these options for the data source.
- Choose Source Category and select a source category from the list for Default Value.
- Choose Custom and enter a custom metadata field. Insert its value in Default Value.
- Key. Select either of these options for the data source.
- Click Next. You will be redirected to the Preview & Done section.
- In the Configure section of your respective app, complete the following fields.
Post-update
Your upgraded app will be installed in the Installed Apps folder, and dashboard panels will start to fill automatically.
See our Release Notes changelog for new updates in the app.
To revert the app to a previous version, do the following:
- Select App Catalog.
- In the Search Apps field, search for and then select your app.
- To version down the app, select Revert to < previous version of your app > from the Manage dropdown.
Uninstalling the Sentry app (Optional)​
To uninstall the app, do the following:
- Select App Catalog.
- In the 🔎 Search Apps field, run a search for your desired app, then select it.
- Click Uninstall.