redash のバックアップをする

redash のデータベースに接続する

次のコマンドで接続します。

sudo -u redash psql -d redash

接続を切るときには次のコマンド。

\q

redash のデータベース容量を確認する

select t1.datname AS db_name, pg_size_pretty(pg_database_size(t1.datname)) as db_size
from pg_database t1
where t1.datname = 'redash'

サーバーのディスク空き容量を確認する

バックアップをする前にサーバーのディスクの空き容量を確認します。

df -hT

データベースのバックアップコマンド

バックアップをします。

sudo -u redash pg_dump redash | gzip > redash_backup.gz

バックアップコマンド

JavaScriptのCPU問題箇所特定ツール:sjsp

はてなの中の人が、Mackerelのフロントエンドの性能チューニングのために作成したsjspが、サーバレスアーキテクチャによる時系列データベースの構築と監視 / Serverlessconf Tokyo 2017dで紹介されていました。

sjspにトランスパイルするだけでCPU boundな処理がわかるそうな。

sjspについては、「シンプルでかつ最高のJavaScriptプロファイラ sjsp を作りました! ― Webアプリケーションが複雑化する中でプロファイラに求められるものとは何か」で説明されています。

こんな感じの結果が出るなんて素晴らしい!

========== SORT BY TIME ==========
time: 30.20sec   count:  71      test6  test.js  (line: 31, col: 18)  function test6() {
time: 16.47sec   count:  41      test7  test.js  (line: 37, col: 18)  function test7() {
time: 15.49sec   count: 133      test4  test.js  (line: 19, col: 18)  function test4() {
time:  5.98sec   count: 216      test1  test.js  (line:  1, col: 18)  function test1() {
time:  4.37sec   count:  18      test5  test.js  (line: 25, col: 18)  function test5() {
time:  3.24sec   count: 512      test3  test.js  (line: 13, col: 18)  function test3() {
time:  0.87sec   count:  67  anonymous  test.js  (line: 49, col: 24)  setInterval(function() {
time:  0.80sec   count:   2      test2  test.js  (line:  7, col: 18)  function test2() {
time:  0.44sec   count:   2  anonymous  test.js  (line: 43, col: 23)  setTimeout(function() {
========== SORT BY COUNT ==========
time:  3.24sec   count: 512      test3  test.js  (line: 13, col: 18)  function test3() {
time:  5.98sec   count: 216      test1  test.js  (line:  1, col: 18)  function test1() {
time: 15.49sec   count: 133      test4  test.js  (line: 19, col: 18)  function test4() {
time: 30.20sec   count:  71      test6  test.js  (line: 31, col: 18)  function test6() {

node_exporter の次期アップグレードで変更になるオプション設定

現時点ではリリースされていないのですが、masterに後方互換のない破壊的変更が入っていますので紹介します。

node_exporterでは、28個のコレクターが既定で有効になっています。
既定で有効になっているコレクターを無効にするには、「–no-collector.<name>」をflagに設定します。

例えば、arpとcpuを無効にするには、オプションに次のように指定します。

./node_exporter –no-collector.arp –no-collector.cpu

また、node_exporterは、既定では無効になっている16個のコレクターがあります。
それらを有効にするには、「–collector.<name>」をflagに設定します。

例えば、logindを有効にするには、オプションに次のように指定します。

./node_exporter –collector.logind

実装

コレクターの実装を見てみましょう。
コレクターをnode_exporterに登録するには、init時に「registerCollector」で登録します。
引数にコレクター名と、デフォルトで有効か無効かと、実装関数を渡します。

func init() {
    registerCollector("bonding", defaultDisabled, NewBondingCollector)
}

collector.go では、配列に実装関数とコレクターフラグ名・有効無効とをそれぞれに格納します。

collectorState[collector] = flag
factories[collector] = factory

後は順次、ループで非同期でコレクターをexecuteしていきます。

// Collect implements the prometheus.Collector interface.
func (n nodeCollector) Collect(ch chan<- prometheus.Metric) {
	wg := sync.WaitGroup{}
	wg.Add(len(n.Collectors))
	for name, c := range n.Collectors {
		go func(name string, c Collector) {
			execute(name, c, ch)
			wg.Done()
		}(name, c)
	}
	wg.Wait()
}

Prometheus Alertmanager 0.9.0/0.9.1 リリースの機能追加内容

Prometheus Aertmanager 0.9.0が9/28に、バグ修正がされた0.9.1が9/29にリリースされました。
0.9.0 で追加された機能について紹介します。その他にも多くのバグが修正されています。

  1. webhookメッセージに現在時刻が追加されました
  2. slackの通知にlink_nameが追加されました
  3. 選択/ハイライトできるラベルUIが作成されました
  4. 注釈内にクリックできるリンクUIが作成されました
  5. API経由でアラートのfingerprint(ユニークな識別子)を出力できるようにしました
  6. READMEにamtoolに関する記述を追加しました
  7. Aertmanager全体で、ユーザー設定ロギングオプションを使用するようにしました
  8. fingerprintでソートしてAPIからアラートを返すようにしました
  9. サイレンスページビューで編集/削除するサイレンスボタンを追加しました
  10. amtoolにcheck configをするサブコマンドを追加しました
  11. メール通知でテキストサポートを追加しました
  12. make build時に対象のバイナリ名を渡せるようにしました
  13. プレビューでサイレントアラート数を表示するようにしました
  14. 期限切れサイレンスのとき確認ダイアログを出すようにしました

1.webhookメッセージに現在時刻が追加されました

通知送信のデバッグをしやすくするため、webhookの標準出力に現在時刻が追加されました。

2017/07/18 11:38:25 6
2017/07/18 11:38:25 [foo@bar.com baz@quux.edu]

 

2.slackの通知にlink_nameが追加されました

Slackに通知を送信する際に、link_nameオプションを設定できるようになりました。
link_nameをtrueに設定することで、Slackに通知されたときに、ユーザー名やチャネル名にリンクが張られます。
link_nameのイメージは、Slack API でユーザ・チャンネルの名前がリンクされないときの対処法を参照すると理解しやすいです。

configで、次のように指定すれば使用可能です。

slack_configs:
   link_names: true

 

3.選択/ハイライトできるラベルUIが作成されました

ラベルUIが変更されました。これまではフィルタリング用のボタンで、文字列をコピーしずらい状況でした。
選択可能な部分とボタンにわけることで、ラベル文字列を選択してコピーできるようになりました。

image

 

4.注釈内にクリックできるリンクUIが作成されました

annotation(注釈)内に、http(s)://で始まる文字列があったら、クリックできるようにしました。

image

 

5.API経由でアラートのfingerprint(ユニークな識別子)を出力できるようにしました

http://localhost:9093/api/v1/alertsのAPIからalertを取得した際のレスポンスにfingerprintを含めるようにしました。

"status":{"state":"suppressed","silencedBy":null,"inhibitedBy":["8531739189852378575"]},"receivers":["slack"],"fingerprint":"6543bc164be4f176"}

fingerprintが出力されることで、Alertを識別できるようになります。

 

6.READMEにamtoolに関する記述を追加しました

READMEにAmtoolに関する説明が追加されました。

Amtoolは、altermanager apiを利用するCLIツールです。
全てのアラートの参照
アラートの詳細を表示
クエリでフィルターしてアラートを出力
アラートをサイレンスにする
サイレンス一覧を表示
すべてのサイレンスを期限切れにする

 

7.Aertmanager全体で、ユーザー設定ロギングオプションを使用するようにしました

サブコンポーネント用に新たしロガーを作成するのではなく、基本ロガーを用いるようにします。
CLIは渡されたロギングオプションを利用するようになります。

 

8.fingerprintでソートしてAPIからアラートを返すようにしました

APIからアラートを取得する際に、結果をfingerprintで並べ替えてから出力されるようになりました。

 

9.サイレンスページビューで編集/削除するサイレンスボタンを追加しました

サイレンスビュー(http://example.com:9093/#/silences/)に、Edit、Expireボタンが追加されました

image

image

 

10.amtoolにcheck configをするサブコマンドを追加しました

amtoolにコンフィグをチェックするコマンドが追加されました。

$ ./amtool check-config alertmanager.yml ./doc/examples/simple.yml
Checking 'alertmanager.yml'  SUCCESS
Found 1 templates:   FAILED: template: foo.tmpl:3: unexpected {{end}}
Checking './doc/examples/simple.yml'  SUCCESS
Found 1 templates:   SUCCESS
Error: Failed to validate 1 file(s).

 

11.メール通知でテキストサポートを追加しました

それまでメール通知はHTMLメールでしたが、テキストメールも送信できるようにオプションが追加sれました。

オプション:text

 

12.make build時に対象のバイナリ名を渡せるようにしました

make時にバイナリ名を指定できるようにしました。

$make build BINARIES=amtool
>> building binaries
 >   amtool

バイナリ名を設定しない場合は、通常通りビルドします。

 

13.プレビューでサイレントアラート数を表示するようにしました

サイレンスページで、指定した条件に当てはまる件数が何件あるのかをpreviwボタンを押した際に表示するようにしました

image

image

 

14.サイレンスを期限切れにする際に確認ダイアログを出すようにしました

EC2 DiscoveryでIAMロールで認証できるオプションが追加

2017/9/9 に、Prometheus の master ブランチにマージされ、EC2 Discovery で、IAMロール認証を使用できるオプションが追加されました。

yamlファイルに次のオプションを指定すれば利用できます。

role_arn: ‘arn:aws:iam::account-id:role/role-name’

認証ロジックとしては、シンプルな修正で済んでますね。

if d.roleARN != "" {
        creds := stscreds.NewCredentials(sess, d.roleARN)
        ec2s = ec2.New(sess, &aws.Config{Credentials: creds})
}