1. Mở đầu
- Mình có thằng bạn ở dự án khác kể rằng, hắn làm 1 package để tracking khi có lỗi sẽ gửi thông báo về chatwork cho cá nhân hoặc 1 box chung nào đó => đỡ mất công truy cập vào server rồi xem log => đỡ tốn thời gian và bảo mật hơn server hơn. Ồ, hay đấy bạn êi. Đương nhiên mình nghĩ chỉ nên dùng trên môi trường development, staging thôi nhé, chứ product thì phải xem xét =))
- Cơ mà dự án lại dùng slack thì sao nhỉ ? Vậy trong bài nãy mình sẽ hướng dẫn cơ bản cách tích hợp và sử dụng gem slack-notifier để bắn thông báo về slack nhé.
2. Setup
2.1 Tạo webhook
- Đăng nhập slack
- https://slack.com/create#email
- Tạo webhook (Incoming webhook) ở đây nè .
2.2 Chọn channel
- Ngay sau khi chọn hook, form select channel sẽ được hiển thị.
- Ở đây bạn muốn notify gửi vào đâu thì chọn channel đó nhé
- Chọn rồi submit thoai (ví dụ mình chọn #general)
2.3 Webhook URL
- Sau khi submit form thành công, hệ thống sẽ trả về cho bạn 1 URL. Đó chính là webhook URL để ta sử dụng kết nối đến slack.
- URL có dạng như sau
1 2 | https://hooks.slack.com/services/XXXXXXX/YYYYYYY/ZZZZZZZZZZZZZZZZ |
- Note: x, y, z là các ký tự ngẫu nhiên.
2.4 Setup Rails
- Nếu bạn chưa có project Rails app nào thì hãy tạo nhé, rồi cài đặt gem như sau
1 2 | gem <span class="token function">install</span> slack-notifier |
- Bạn có thể thử gem bằng code như sau.
1 2 3 4 | <span class="token keyword">require</span> <span class="token string">"slack-notifier"</span> notifier <span class="token operator">=</span> <span class="token constant">Slack</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Notifier</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token string">"https://hooks.slack.com/services/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"</span> notifier<span class="token punctuation">.</span>ping <span class="token string">"Hello World from <span class="token interpolation"><span class="token delimiter tag">#{</span><span class="token constant">Rails</span><span class="token punctuation">.</span>application<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span>parent_name<span class="token delimiter tag">}</span></span>"</span> |
- Bạn sẽ nhìn thấy dòng chữ “Hello World from AppName” trên box chat slack của mình ngay sau đó
Bạn có thể config gửi thông báo bằng tên khác như sau
1 2 3 4 5 | <span class="token keyword">require</span> <span class="token string">"slack-notifier"</span> notifier <span class="token operator">=</span> <span class="token constant">Slack</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Notifier</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token string">"https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"</span> notifier<span class="token punctuation">.</span>username <span class="token operator">=</span> <span class="token string">"letung"</span> notifier<span class="token punctuation">.</span>ping <span class="token string">"Hello World from <span class="token interpolation"><span class="token delimiter tag">#{</span><span class="token constant">Rails</span><span class="token punctuation">.</span>application<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span>parent_name<span class="token delimiter tag">}</span></span>"</span> |
Gửi vào 1 channel nào đó :
1 2 3 4 5 | <span class="token keyword">require</span> <span class="token string">"slack-notifier"</span> notifier <span class="token operator">=</span> <span class="token constant">Slack</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Notifier</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token string">"https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"</span> notifier<span class="token punctuation">.</span>channel <span class="token operator">=</span> <span class="token string">"#report"</span> notifier<span class="token punctuation">.</span>ping <span class="token string">"Hello World from <span class="token interpolation"><span class="token delimiter tag">#{</span><span class="token constant">Rails</span><span class="token punctuation">.</span>application<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span>parent_name<span class="token delimiter tag">}</span></span>"</span> |
Thêm link vào message
1 2 3 4 5 6 | <span class="token keyword">require</span> <span class="token string">"slack-notifier"</span> notifier <span class="token operator">=</span> <span class="token constant">Slack</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Notifier</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token string">"https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"</span> <span class="token comment"># sending links in message</span> notifier<span class="token punctuation">.</span>ping <span class="token string">"<a href='https://viblo.asia'>Viblo</a> has some errors"</span> |
2.5 Format message
- Để message trở nên dễ nhìn hơn thì chúng ta cần format cho nó đẹp như là in hoa, gạch chữ, liệt kê theo danh sách, …
- Mình đưa ra một số ví dụ nhé:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token keyword">require</span> <span class="token string">"slack-notifier"</span> notifier <span class="token operator">=</span> <span class="token constant">Slack</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Notifier</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token string">"https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"</span> <span class="token comment"># in hoa</span> notifier<span class="token punctuation">.</span>ping <span class="token string">"bold text: *in hoa nè*"</span> <span class="token comment"># kiểu danh sách liệt kê</span> notifier<span class="token punctuation">.</span>ping "<span class="token constant">Here</span> is the list below <span class="token operator">-</span> undefined some variables <span class="token operator">-</span> undefined some method <span class="token operator">-</span> code như <span class="token operator">*</span>beep <span class="token operator">-</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> " <span class="token comment">#Blockquotes</span> notifier<span class="token punctuation">.</span>ping "<span class="token operator">></span> <span class="token constant">Leader</span> said <span class="token constant">OTTTTTTTTTT</span> <span class="token constant">What</span> is your opinion<span class="token operator">?</span> " <span class="token comment">#Code Blocks</span> notifier<span class="token punctuation">.</span>ping <span class="token string">"Some `formatted code` displayed"</span> notifier<span class="token punctuation">.</span>ping "<span class="token constant">Some</span> ``` multiline formatted code <span class="token constant">Another</span> line``` was just displayed" |
3. Gửi thông báo khi có exception về slack
- Cài đặt gem
1 2 | gem <span class="token string">"exception_notification"</span> |
1 2 | bundle <span class="token function">install</span> |
- Ở đây mình sẽ config gửi về channel #exceptions nhé
- Config cơ bản sẽ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token constant">Rails</span><span class="token punctuation">.</span>application<span class="token punctuation">.</span>config<span class="token punctuation">.</span>middleware<span class="token punctuation">.</span>use <span class="token constant">ExceptionNotification</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rack</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token punctuation">{</span> email_prefix<span class="token punctuation">:</span> <span class="token string">"[PREFIX] "</span><span class="token punctuation">,</span> sender_address<span class="token punctuation">:</span> <span class="token string">%{"notifier" <<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>>}</span><span class="token punctuation">,</span> exception_recipients<span class="token punctuation">:</span> <span class="token string">%w{<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> slack<span class="token punctuation">:</span> <span class="token punctuation">{</span> webhook_url<span class="token punctuation">:</span> <span class="token string">"https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"</span><span class="token punctuation">,</span> <span class="token comment"># webhook URL</span> channel<span class="token punctuation">:</span> <span class="token string">"#exceptions"</span><span class="token punctuation">,</span> additional_parameters<span class="token punctuation">:</span> <span class="token punctuation">{</span> icon_url<span class="token punctuation">:</span> <span class="token string">"https://image.jpg"</span><span class="token punctuation">,</span> mrkdwn<span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Oke ngon rồi, giờ bạn có thể thử tạo 1 lỗi và check message ở slack nhé.
- Ngoài ra bạn có thể tham khảo thêm về cách tích hợp API ở đây:
- Slack API – https://api.slack.com
- Slack – Incoming WebHooks