From 18feca6e49d5c0318fd94b64e806de6bc0481599 Mon Sep 17 00:00:00 2001 From: Ian Mitchell Date: Sat, 27 Oct 2018 12:12:31 -0700 Subject: [PATCH] Initial commit --- .gitignore | 4 + LICENSE | 21 ++++++ README.md | 23 ++++++ index.js | 76 +++++++++++++++++++ now.json | 13 ++++ package.json | 23 ++++++ sentry-icon.png | Bin 0 -> 6008 bytes yarn.lock | 191 ++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 351 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 index.js create mode 100644 now.json create mode 100644 package.json create mode 100644 sentry-icon.png create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b2135a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Dependencies and Build +node_modules +now-secrets.json +now-required.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8c81588 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Ian Mitchell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d8a7a5d --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# sentry-discord + +This is a basic `micro` server that accepts an incoming [Sentry](https://sentry.io) webhook and transforms it to the format expected by [Discord](https://discordapp.com/). + +## Usage + +This repository is configured to run with [Zeit Now](https://zeit.co/now). + +First you'll need to create a Discord Webhook in the channel you wish to send alerts to. Once you've created a webhook, clone this repository. Remove the + +``` +"alias": "sentry-discord", +``` + +line from `now.json` and run + +``` +$ now +``` + +Now will prompt you for the Webhook URL - paste the Discord Webhook URL you created. After that, Now should give you the URL to your new deployment. + +Finally, add a new Webhook alert to Sentry by pasting in the Now deployment URL. When you click `Test Plugin` on Sentry, you should receieve an alert on Discord. diff --git a/index.js b/index.js new file mode 100644 index 0000000..6f802b2 --- /dev/null +++ b/index.js @@ -0,0 +1,76 @@ +require('now-env'); +const { json } = require('micro'); +const handler = require('serve-handler'); +const fetch = require('node-fetch'); +const dedent = require('dedent-js'); + +const COLORS = { + 'debug': parseInt('fbe14f', 16), + 'info': parseInt('2788ce', 16), + 'warning': parseInt('f18500', 16), + 'error': parseInt('e03e2f', 16), + 'fatal': parseInt('d20f2a', 16), +}; + +module.exports = async (request, response) => { + if (request.method === 'GET') { + return handler(request, response); + } + + const body = await json(request); + + const payload = { + username: 'Sentry', + avatar_url: `${process.env.NOW_URL}/sentry-icon.png`, + embeds: [ + { + title: body.project_name, + type: 'rich', + description: body.message, + url: body.url, + timestamp: (new Date(body.event.received * 1000)).toISOString(), + color: COLORS[body.level] || COLORS.error, + footer: { + icon_url: 'https://github.com/fluidicon.png', + text: 'ianmitchell/sentry-discord', + }, + fields: [ + { + name: `${body.event.template.filename}:${body.event.template.lineno}`, + value: dedent` + \`\`\` + ${body.event.template.context_line} + \`\`\` + `, + } + ] + } + ] + }; + + if (body.event.tags) { + payload.embeds[0].fields.push({ + name: '**Tags**', + value: body.event.tags.map(([key, value]) => `${key}: ${value}`).join('\n'), + inline: true, + }); + } + + if (body.event.user) { + payload.embeds[0].fields.push({ + name: '**User**', + value: body.event.user.username, + inline: true, + }); + } + + console.log(payload.embeds[0].fields); + + const val = await fetch(process.env.WEBHOOK, { + method: 'POST', + body: JSON.stringify(payload), + headers: { 'Content-Type': 'application/json' }, + }); + + console.log(val); +} diff --git a/now.json b/now.json new file mode 100644 index 0000000..df65c71 --- /dev/null +++ b/now.json @@ -0,0 +1,13 @@ +{ + "name": "sentry-discord", + "alias": "sentry-discord", + "env": [ + "WEBHOOK" + ], + "scale": { + "sfo1": { + "min": 1, + "max": 1 + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..26e44ec --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "sentry-discord", + "version": "1.0.0", + "description": "Routes Sentry Webhooks to Discord", + "author": { + "name": "Ian Mitchell", + "email": "ian.mitchel1@live.com", + "url": "http://ianmitchell.io" + }, + "repository": "ianmitchell/sentry-discord", + "license": "MIT", + "main": "index.js", + "scripts": { + "start": "micro" + }, + "dependencies": { + "dedent-js": "^1.0.1", + "micro": "^9.3.3", + "node-fetch": "^2.2.0", + "now-env": "^3.1.0", + "serve-handler": "^5.0.5" + } +} diff --git a/sentry-icon.png b/sentry-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f3cc5509ba0508fdbf635ff4234556ceb8fb973e GIT binary patch literal 6008 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 X<r5QX literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..06d5e8b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,191 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +arg@2.0.0: + version "2.0.0" + resolved "http://registry.npmjs.org/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +chalk@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +dedent-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dedent-js/-/dedent-js-1.0.1.tgz#bee5fb7c9e727d85dffa24590d10ec1ab1255305" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + dependencies: + punycode "^1.3.2" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +is-stream@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +micro@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.3.tgz#32728c7be15e807691ead85da27fd8117a8bca24" + dependencies: + arg "2.0.0" + chalk "2.4.0" + content-type "1.0.4" + is-stream "1.1.0" + raw-body "2.3.2" + +mime-db@~1.33.0: + version "1.33.0" + resolved "http://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@2.1.18: + version "2.1.18" + resolved "http://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +node-fetch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" + +now-env@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/now-env/-/now-env-3.1.0.tgz#e0198b67279d387229cfd4b25de4c2fc7156943f" + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +serve-handler@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-5.0.5.tgz#58707d2d5e3774098433469d7f51151ccb9a5d05" + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +"statuses@>= 1.3.1 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"