์ ๋ ์ฌ์ด๋ ํ๋ก์ ํธ์ธ MUFI์์ ํฌํ ๋ถ์ค ํค์ค์คํฌ, ๋ชจ๋ฐ์ผ ์น, ์ด๋๋ฏผ ๋ฑ ๋ค์ํ ํ๋ก๋ํธ๋ฅผ ๊ฐ๋ฐ ์ค์ธ๋ฐ์. 2๋ ๋ฐ ์ ๋ ํ๋๊น ๊ธฐ๊ณ๊ฐ ์ด๋๋ง ์ด๋๊ฐ ํ์ฉ ๋๊ฒ ๋์ด์ ํ์ฅ์์ ์ด๋ฐ ๋ณด์ด์ค๊ฐ ๋ค๋ ค์์ด์.
์๋๋ ์๋ฌ ๋ฆฌํฌํ ํด์ธ Sentry๋ฅผ ์ฐ๊ณ ์์ด์ ์ ์๊ฒ๋ ์๋ฌ๊ฐ ๋ ๋๋ง๋ค ๋ฉ์ผ์ด ๋ ์์ค๊ณ ์์๊ฑฐ๋ ์. ์ด๊ฑธ ์ฌ๋ ์ฑ๋์ผ๋ก๋ง ์ด์ฃผ๋ฉด ํ์ฅ ์ด์์ง๊ณผ ํจ๊ป ๊ณต์ ํ ์ ์๊ฒ ๋ค๊ณ ๊ฐ๋จํ๊ฒ ์๊ฐํ์ด์! ํ์ง๋ง..
Sentry ์๋ฌ๋ฅผ ์ฌ๋์ ์ด์ฃผ๋ ๊ฑด ์๋ ์๊ฐํ๋ ๋๋ก ๊ฐ๋จํ์ง ์์์ด์.
์๋, ๊ฐ๋จํ์ง๋ง ๋์ด ๋ค์์ด์ ๐ซ
Sentry์์๋ Slack Integration์ ์ฐ๋ ค๋ฉด ์ต์ ํ ํ๋ ์ด์์ ๊ตฌ๋ ํด์ผ ํ๊ณ , ์ด ๊ฐ๊ฒฉ์ ๋ฌด๋ ค ์ $29(์ฝ 39,000์) ์์ด์.
์ด ๊ธฐ๋ฅ ํ๋๋ง ๋ณด๊ณ ๋งค๋ฌ 4๋ง์์ ๊ฐ๊น์ด ๋น์ฉ์ ๋ด๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ด์ง ์๋ค๊ณ ์๊ฐํด์, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๊ธฐ๋ก ํ์ด์.
Sentry Integration ๋ชฉ๋ก์ ์ดํด๋ณด๋ ์ค, ์นํ ์ ์ง์ํ๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ์ด์.
๊ทธ๋ฆฌ๊ณ ์นํ ์ ์ฐ๋ ๊ฑด ๋ฌด๋ฃ ํ๋์ผ๋ก๋ ๊ฐ๋ฅํด์, ์ด๊ฑธ IFTTT๋ Zapier ๊ฐ์ ์๋ํ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ค์ด์ ์ฌ๋์ ์ด์ฃผ๋ฉด ๋๊ฒ ๋ค ์๊ฐํ์ด์.
๊ทธ๋์ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ด ์๋ Zapier์์ ๊ฐ๋จํ๊ฒ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ฑํด์ ํ ์คํธ๊น์ง ๋๋ ๊ฑธ ํ์ธํ์ด์.
์ฌ์ง์ด Zapier์์๋ AI Copilot์ผ๋ก ์ํ๋ ๋์์ ๋งํ๋ฉด ์ํฌํ๋ก์ฐ๋ฅผ ๊ฑฐ์ ๋ค ๋ง๋ค์ด์ค์ 10๋ถ๋ ์ฑ ๊ฑธ๋ฆฌ์ง ์์์ ๊ธ๋ฐฉ ๋๋ด๊ฒ ๋ค ์๊ฐํ๋๋ฐ..
Sentry Team Plan๋ณด๋ค ๋ ๋น์ผ ๊ฐ์ Zapier Pro๋ฅผ ๊ตฌ๋ ํด์ผ ์นํ ์ ์ธ ์ ์์ด์ ํฌ๊ธฐ.. IFTTT๋ ์ฐพ์๋ณด๋ ์๋์ ์ผ๋ก ์ ๋ ดํ์ง๋ง ์ 14.99๋ฌ๋ฌ ์๊ธ์ ์ง๋ถํด์ผ ์นํ ์ ์จ์ผ ํ์ด์. ๐ฐ๐ฅน
์ฌ์ค ๊ท์ฐฎ์์ ๋ฏธ๋ค์๋ ์ ํ์ง์ธ ์ง์ ๋ง๋ค๊ธฐ๋ฅผ ๊ฒฐ๊ตญ ๊บผ๋ด์ผ ํ์ต๋๋ค.
์์ ๊ฐ์ด ๊ฐ๋จํ ์ค๊ณ ๋ฐ ์๊ตฌ์ฌํญ์ ์์ฑํ๊ณ , ์ ๊ฐ ์ ํ์ด๋ผ ํ ์คํธ๋ก ์ฎ๊ฒจ ์ ์ด๋ณด์๋ฉด
์ด๋ฐ ๊ตฌ์กฐ๋ก ๊ฐ๋ค๋ฉด Cloud Functions ๋น์ฉ๋ง ๋ค๊ฒ ๋๋๋ฐ, ์ฌ์ค์ ๋ฌด๋ฃ๋ก ์ด์์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒฐ๋ก ์ด ๋ฌ์ด์.
Cloud Functions๋ ํ๋์ ์คํฌ๋ฆฝํธ ํ์ผ ์์ค์ผ๋ก๋ง ๊ฐ๋ฐํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, GPTํํ ์๊ตฌ์ฌํญ์ ์ ๋ฌํ๊ณ ์ด์์ ๋ฐ๊ณ ์ํ๋ ๋ชจ์ต์ผ๋ก๋ง ์ฝ๋๋ฅผ ๋ค๋ฌ๋ ์์ค์ผ๋ก ๋ง๋ฌด๋ฆฌํ ์ ์์์ด์.
์ ๊ฐ ์ด๋ค ๋ํ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋์ง๋ ์ด ๋งํฌ๋ฅผ ํตํด์ ํ์ธํ์ค ์ ์์ด์.
์ด๋ ๊ฒ ๋ฐ์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋ ์คํ์ผ๊ณผ ๋ฉ์์ง ์ถ๋ ฅ์ ์ข ๋ ๋ค๋ฌ์ ๊ฒฐ๊ณผ, ์ต์ข ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ก ์์ฑํ์ด์.
const functions = require('@google-cloud/functions-framework');
const { WebClient } = require('@slack/web-api');
functions.http('sentry-to-slack', async (req, res) => {
// Slack Bot Token์ ํ๊ฒฝ ๋ณ์๋ก ์ค์ (GCP ์ฝ์์์ ์ค์ ๊ฐ๋ฅ)
const slackToken = process.env.SLACK_BOT_TOKEN;
const slackChannel = 'YOUR_CHANNEL_ID'; // ๋ณด๋ผ ์ฑ๋์ ID
// WebClient ์ด๊ธฐํ
const slackClient = new WebClient(slackToken);
try {
// Sentry์์ ์นํ
์ผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์
const sentryData = req.body;
console.log('# sentryData', sentryData)
// Slack ๋ฉ์์ง ํฌ๋งท ๊ตฌ์ฑ
const message = {
channel: slackChannel,
blocks: [
{
type: "section",
text: {
type: "mrkdwn",
text: "๐จ *[ํค์ค์คํฌ ์๋ฌ ๋ฐ์]* ๐จ",
},
},
{
type: "section",
text: {
type: "mrkdwn",
text: `*<${sentryData.url}|Sentry ๋งํฌ>*`
}
},
{
type: "section",
fields: [
{
type: "mrkdwn",
text: `*์๋ฌ ๋ฉ์์ง:*\n${sentryData.message}`
},
],
},
{
type: "section",
fields: [
{
type: "mrkdwn",
text: `*์์ธ:*\n${sentryData.culprit}`
},
],
},
{
type: "section",
fields: [
{
type: "mrkdwn",
text: `*๋ฒ์ :*\n${sentryData.release || 'N/A'}`
},
],
},
{
type: "section",
fields: [
{
type: "mrkdwn",
text: `*๋ฐ์์๊ฐ:*\n${sentryData.event.timestamp ? formatTimestamp(sentryData.event.timestamp) : 'N/A'}`
}
]
}
],
};
// Slack์ ๋ฉ์์ง ์ ์ก
await slackClient.chat.postMessage(message);
// ์ฑ๊ณต ์๋ต
res.status(200).send('Notification sent to Slack');
} catch (error) {
console.error('Error sending message to Slack:', error);
res.status(500).send('Error sending notification');
}
});
function formatTimestamp(unixTimestamp) {
// ์ด ๋จ์ Unix ํ์์คํฌํ๋ฅผ ๋ฐ๋ฆฌ์ด๋ก ๋ณํ
const date = new Date(unixTimestamp * 1000);
// UTC ์๊ฐ์์ 9์๊ฐ์ ๋ํด KST๋ก ๋ณํ
const KSTOffset = 9 * 60 * 60 * 1000; // 9์๊ฐ์ ๋ฐ๋ฆฌ์ด๋ก ๋ณํ
const KSTDate = new Date(date.getTime() + KSTOffset);
// ์ฐ๋, ์, ์ผ ๊ฐ์ ธ์ค๊ธฐ
const year = KSTDate.getFullYear();
const month = String(KSTDate.getMonth() + 1).padStart(2, '0'); // ์์ 0๋ถํฐ ์์ํ๋ฏ๋ก 1 ๋ํจ
const day = String(KSTDate.getDate()).padStart(2, '0');
// ์, ๋ถ, ์ด ๊ฐ์ ธ์ค๊ธฐ
const hours = String(KSTDate.getHours()).padStart(2, '0');
const minutes = String(KSTDate.getMinutes()).padStart(2, '0');
const seconds = String(KSTDate.getSeconds()).padStart(2, '0');
// ์ํ๋ ํฌ๋งท์ผ๋ก ๋ฐํ
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
Slack SDK๋ฅผ ์ฐ๊ธฐ ์ํ ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ์ Sentry ์นํ ๋ฑ๋ก, Slack ์ฑ ๋ฑ๋ก ์ ๋์ ๋ถ๊ฐ ์์ ์ ๋ง์น๋ ๋ค์๊ณผ ๊ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ๋์ ๊ฑฐ์ ๋ค์ด์ง ์๊ณ Sentry ์ฌ๋๋ด์ ์์ฑํ ์ ์๊ฒ ๋์์ด์.
Zapier, IFTTT ์ฝ์ง์ ์ ์ธํ๋ฉด ์ค์ง์ ์ธ ์์ ์๊ฐ์ 1์๊ฐ ์ด๋ด์๋๋ฐ, ์ด๋ฐ ๊ฐ๋จํ ์์ค์ ์คํฌ๋ฆฝํ ์ GPT์๊ฒ ๊ฑฐ์ ์์์ํฌ ์ ์์๋ค๋๊ฒ ์ข์ ๋ ์จ์ด ๋์๋ ๊ฒ ๊ฐ์ต๋๋ค!