- 2015.07.02
- 技術ブログ
Lodgeの新着記事を通知したい
こんにちは、久しぶりのmentaikoです。
みなさんはどのようにして情報を共有されているでしょうか?
弊社では技術ネタを共有するためにQiitaクローンのLodgeを利用しています。
導入当初は利用者が少なくどうやれば知ってもらえるか考え、当時利用していたidobataにFluentd経由で新着記事を通知する仕組みを作りました。
idobataに新着記事を通知する仕組み
以下は新着記事を通知するシーケンス図です。
まず、Lodgeは外部向けのAPIやWebhookがないので新着記事の取り出す方法で悩むのですが、
幸いにもLodgeのログにSQLが出力されるので記事詳細を表示する際のSQLを利用しました。
以下は通知用に作成したSQLで、投稿された記事の投稿者ID、記事タイトル、投稿者名、記事のタグ、作成日時、更新日時を取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
SELECT a.id , a.title , u.name , IFNULL( ( SELECT CONCAT('[', GROUP_CONCAT(t.name SEPARATOR ']['), ']') FROM tags t INNER JOIN taggings ts ON t.id = ts.tag_id WHERE ts.taggable_id = a.id AND ts.taggable_type = 'Article' AND ts.context = 'tags' ) , '') AS tags , a.created_at , a.updated_at FROM articles a INNER JOIN users u ON a.user_id = u.id |
記事情報を取得できれば占めたものなので、以下のfluent pluginを組み合わせてidobataのWebhook経由で通知します。
利用したfluent plugin
- fluent-plugin-mysql-replicator
- fluent-plugin-format
- fluent-plugin-out-https
td-agent.confの抜粋
クエリの実行間隔はデフォルトの1分なので、SQLの検索範囲も過去1分以内にしています。
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 27 28 29 30 31 32 33 34 35 36 |
# Lodge New Post <source> type mysql_replicator host localhost username YourUsername password YourPassword database lodge_production query SELECT a.id, a.title, u.name, IFNULL((SELECT CONCAT('[', GROUP_CONCAT(t.name SEPARATOR ']['), ']') FROM tags t INNER JOIN taggings ts ON t.id = ts.tag_id WHERE ts.taggable_id = a.id AND ts.taggable_type = 'Article' AND ts.context = 'tags'), '') AS tags, a.created_at, a.updated_at FROM articles a INNER JOIN users u ON a.user_id = u.id WHERE DATE_ADD(a.created_at, INTERVAL 1 MINUTE) > NOW(); primary_key id enable_delete no tag replicator.lodge.${event}.${primary_key} </source> <match replicator.lodge.insert.**> type copy <store> type stdout </store> <store> type format tag idobata.output include_original_fields false format html source <span class="label label-info">New</span> <a href="http://YourLodgeHost/articles/%{id}">%{title}</a> %{tags} posted by %{name} </store> </match> <match idobata.output> type https use_ssl true endpoint_url https://idobata.io/hook/generic/YourWebhookKey http_method post serializer form </match> |
これで1分以内に新着記事を通知できるようになりました。
また、この仕組みで社内の認知度も上がり利用者を増やすことができました。
以上、Lodgeの新着記事を通知する方法の紹介でした。
今回は通知先がidobataでしたが、他のメッセージングサービスにも簡単に応用できると思います。