2012年2月15日水曜日

Zabbixのlog[]とlogrt[]キーの動作

Zabbixにはログ監視用のアイテムとしてlog[]とlogrt[]キーがあります。ともにテキストベースのログファイルを監視し、1行を1データとしてZabbixサーバに送付、文字列マッチを行って障害判定をすることができます。

これらのキーを使ったときに、Zabbix内部ではどのような動作をしているのかというのが見えにくいですし、ログ関係はZABBIX-JPのフォーラムでもよく質問があります。私自身、質問を受けるたびに何度もソースコードを調べている気がするので、一度まとめておこうと思います。

解説に利用しているソースコードは1.8.10です。間違っていたらコメントでご指摘いただけると助かります。

log[]キーの動き

log[]キーはZabbix 1.1から追加されれいるログ監視用のキーです。1.6まではログ監視をするにはこのキーを利用する以外の手段はありませんでした。アイテムのキーには以下のように実際に監視するファイル名をそのままオプションに設定します。

log[file_path,regexp,encoding,maxlines]

regexp以降は1.8で追加されたオプションです。単純にファイルを監視するだけであれば、以下のように設定できます。

log[/var/log/messages]

logキーの処理はソースコードのsrc/zabbix_agent/logfiles.cの598行目から始まるprocess_log()関数で定義されています。

/* handling of file shrinking */
if (0 != zbx_stat(filename, &buf))
{
    zabbix_log(LOG_LEVEL_WARNING, "cannot stat [%s]: %s", filename, zbx_strerror(errno));
    return ret;
}

ここでファイルをの状態を取得し、

if (buf.st_size < *lastlogsize)
    *lastlogsize = 0;

ここでファイルのサイズがlastlogsizeよりも小さければ、lastlogsizeを0に設定しています。

lastlogsizeというのはログファイルをどこまで読んだかを記録しておく変数で、つまり、前回読んだバイト数よりもファイルが小さくなっていれば、ファイルが新規作成もしくはローテートされたと判断して、ファイルを先頭から読みにいくようになっています。

if (-1 == (f = zbx_open(filename, O_RDONLY)))
{
    zabbix_log(LOG_LEVEL_WARNING, "cannot open [%s]: %s", filename, zbx_strerror(errno));
    return ret;
}

ファイルをREADONLYでオープンし、

if ((off_t)-1 != lseek(f, (off_t)*lastlogsize, SEEK_SET))
{
    if (-1 != (nbytes = zbx_read(f, buffer, sizeof(buffer), encoding)))
    {
        if (0 != nbytes)
        {
            *lastlogsize += nbytes;
            *value = convert_to_utf8(buffer, nbytes, encoding);
            zbx_rtrim(*value, "\r\n ");
        }
        ret = SUCCEED;
    }
    else
        zabbix_log(LOG_LEVEL_WARNING, "cannot read from [%s]: %s", filename, zbx_strerror(errno));
}
else
    zabbix_log(LOG_LEVEL_WARNING, "cannot set position to [%li] for [%s]: %s", *lastlogsize, filename, zbx_strerror(errno));

close(f);

lastlogsize以降の文字列をutf8に変換しながら読み込み、読んだバイト分lastlogsizeを増加させ、ファイルをクローズしています。このときbufferのサイズはMAX_BUFFER_LENで定義されている65536B=64KBなので、それを超えない行末までを1度に読み込んでいます。

ここでvalueに読み込まれた文字列とlastvalueの値は最終的にソースのsrc/zabbix_agent/active.cの753行目あたりからの処理

while (SUCCEED == (ret = process_log(filename, &lastlogsize, &value, encoding)))
{
    if (NULL == value) /* End of file. The file could become empty, must save `lastlogsize'. */
    {
        active_metrics[i].lastlogsize = lastlogsize;
        break;
    }

    if (SUCCEED == regexp_match_ex(regexps, regexps_num, value, pattern, ZBX_CASE_SENSITIVE))
    {
        send_err = process_value(server, port, CONFIG_HOSTNAME,
                active_metrics[i].key_orig, value, &lastlogsize,
                NULL, NULL, NULL, NULL, NULL, 1);
        s_count++;
    }
    p_count++;

    zbx_free(value);

    if (SUCCEED == send_err)
        active_metrics[i].lastlogsize = lastlogsize;
    else
    { /* buffer is full, stop processing active checks till the buffer is cleared */
        lastlogsize = active_metrics[i].lastlogsize;
        goto ret;
    }

    /* do not flood Zabbix server if file grows too fast */
    if (s_count >= (maxlines_persec * active_metrics[i].refresh))
        break;

    /* do not flood local system if file grows too fast */
    if (p_count >= (4 * maxlines_persec * active_metrics[i].refresh))
        break;
} /* while processing a log */

でvalueの値はprocess_value()関数に処理され、lastvalueの値はactive_metrics配列にセットされています。active_metrics配列にはZabbixサーバから取得したアクティブチェックのアイテム設定が入っています。これらの値は最終的にZabbixサーバに送付され処理されます。

このwhile部分は1回の監視処理で1度呼ばれ、gotoまたはbreakが呼ばれるまで繰り返しprocess_log()関数を実行して64KBづつファイルを読んでいます。

ループを抜ける条件としては、

  • ログファイルの末尾まで読む
  • Zabbixエージェントのバッファ(Zabbixサーバに送信前のデータを溜めておくもの)が一杯になる
  • s_count(Zabbixサーバに送付する行数)がmaxlinex_persec * アイテムの監視間隔(秒)に達する
  • p_count(読み込んだログの行数)が4 * maxlinex_persec * アイテムの監視間隔(秒)に達する

のいずれかです。ログの途中で終了した場合は次の監視の時に続きから読みます。

maxlines_persecはlog[]キーのmaxlinesパラメータで指定された値か、zabbix_agentd.confのMaxLinesPerSecondパラメータで指定された値を使用します。

logrt[]キーの動き

logrt[]キーはローテーションをするログファイルを監視するためのキーで、1.8から新しく追加されています。アイテムのキーには以下のように設定します。

logrt[file_format,regexp,encoding,maxlines]

log[]キーと異なるのはファイル指定部分に正規表現が利用できる点です。例えば以下のように指定します。

logrt[/var/log/messages.*]

logrt[]キーの動作としてはフォルダを探索し、マッチするファイルを抜き出し、監視すべきファイルを選定してからファイルを読みます。この処理が入るためlog[]キーよりは動作が複雑です。それ以外はlog[]キーとほぼ同じ動作をしますので、ここではファイルの選択ロジックについてのみ解説します。

ちなみに、ファイル名部分に利用できるのは正規表現です。正規表現をシェルのワイルドカードと誤解している人をよく見かけます。正規表現で*は「直前の文字の0回以上の繰り返し」なので、間違えると思いがけないファイルまで読んでしまう場合があるので注意してください。

logrtキーの処理はソースコードのsrc/zabbix_agent/logfiles.cの366行目から始まるprocess_logrt()関数で定義されています。Windowsとそれ以外で処理が分かれているので、ここではWindows部分の解説は飛ばします。

/* splitting filename */
if (SUCCEED != split_filename(filename, &directory, &format))
{
    zabbix_log(LOG_LEVEL_WARNING, "filename [%s] does not contain a valid directory and/or format", filename);
    return FAIL;
}

ここで指定されたパスをディレクトリとファイル名に分けて、

if (NULL == (dir = opendir(directory)))
{
    zabbix_log(LOG_LEVEL_WARNING, "cannot open directory [%s] for reading: %s", directory, zbx_strerror(errno));
    zbx_free(directory);
    zbx_free(format);
    return FAIL;
}

ディレクトリをオープン

while (NULL != (d_ent = readdir(dir)))
{
    logfile_candidate = zbx_dsprintf(logfile_candidate, "%s%s", directory, d_ent->d_name);

    if (-1 == zbx_stat(logfile_candidate, &file_buf) || !S_ISREG(file_buf.st_mode))
    {
        zabbix_log(LOG_LEVEL_DEBUG, "cannot process read entry [%s]", logfile_candidate);
    }
    else if (NULL != zbx_regexp_match(d_ent->d_name, format, &length))
    {
        zabbix_log(LOG_LEVEL_DEBUG, "adding the file [%s] to logfiles", logfile_candidate);
        add_logfile(&logfiles, &logfiles_alloc, &logfiles_num, d_ent->d_name, (int)file_buf.st_mtime);
    }
    else
        zabbix_log(LOG_LEVEL_DEBUG, "[%s] does not match [%s]", logfile_candidate, format);

    zbx_free(logfile_candidate);
}

ディレクトリにあるファイルから、指定された正規表現にマッチするファイルを探してlogfiles配列に追加しています。

途中にあるadd_logfile()関数でlogfiles配列への追加処理を行っているのですが、この関数内は

  • ファイルのmtime(ファイルの更新日時)が古い順
  • mtimeが同じ場合はアルファベット/数字の降順(z->a, 9->0)

に並ぶように処理されています。

/* find the oldest file that match */
for (i = 0; i < logfiles_num; i++)
{
    if (logfiles[i].mtime < *mtime)
        continue;   /* not interested in mtimes less than the given mtime */
    else
        break;  /* the first occurrence is found */
}

ここで*mtimeとなっているのは、前回ログを読み込んだ際に記憶しておいたmtimeです。つまり、logfiles配列にあるログファイルのmtimeと前回読んだファイルのmtimeを比較して、最初に見つけた「前回よりもmtimeが新しいファイル」のインデックスが変数iに入ります。logfiles配列の先頭から読んでいるので、配列の順番が重要です。

/* escaping those with the same mtime, taking the latest one (without exceptions!) */
for (j = i + 1; j < logfiles_num; j++)
{
    if (logfiles[j].mtime == logfiles[i].mtime)
        i = j;  /* moving to the newer one */
    else
        break;  /* all next mtimes are bigger */
}

ここでは先ほど見つけたmtimeが新しいログファイルを基準に、それよりもlogfiles配列の後ろにあるファイルを探索してmtimeを比較しています。mtimeが同じファイルがあれば、より配列の後ろにあるファイルが選択されます。(実際にはインデックスが変数iに入る)

/* if all mtimes are less than the given one, take the latest file from existing ones */
if (0 < logfiles_num && i == logfiles_num)
    i = logfiles_num - 1;   /* i cannot be bigger than logfiles_num */

最終的にインデックスiが配列の最後まで行ってしまった場合は、logfiles配列の一番後ろのログファイルが選択されます。

ここから実際にログファイルを読む部分です。少し長いですがそのまま貼付けます。

/* processing matched or moving to the newer one and repeating the cycle */
for ( ; i < logfiles_num; i++)
{
    logfile_candidate = zbx_dsprintf(logfile_candidate, "%s%s", directory, logfiles[i].filename);
    if (0 != zbx_stat(logfile_candidate, &file_buf))/* situation could have changed */
    {
        zabbix_log(LOG_LEVEL_WARNING, "cannot stat [%s]: %s", logfile_candidate, zbx_strerror(errno));
        break;  /* must return, situation could have changed */
    }

    *mtime = (int)file_buf.st_mtime;    /* must contain the latest mtime as possible */
    if (file_buf.st_size < *lastlogsize)
    {
        *lastlogsize = 0;   /* maintain backward compatibility */
    }

    if (-1 == (fd = zbx_open(logfile_candidate, O_RDONLY)))
    {
        zabbix_log(LOG_LEVEL_WARNING, "cannot open [%s]: %s", logfile_candidate, zbx_strerror(errno));
        break;  /* must return, situation could have changed */
    }

    if ((off_t)-1 != lseek(fd, (off_t)*lastlogsize, SEEK_SET))
    {
        if (-1 != (nbytes = zbx_read(fd, buffer, sizeof(buffer), encoding)))
        {
            if (0 != nbytes)
            {
                *lastlogsize += nbytes;
                *value = convert_to_utf8(buffer, nbytes, encoding);
                zbx_rtrim(*value, "\r\n ");
                ret = SUCCEED;
                break;  /* return at this point */
            }
            else    /* EOF is reached, but there can be other files to try reading from */
            {
                if (i == logfiles_num - 1)
                {
                    ret = SUCCEED;  /* EOF of the the most current file is reached */
                    break;
                }
                else
                {
                    zbx_free(logfile_candidate);
                    *lastlogsize = 0;
                    close(fd);
                    continue;   /* try to read from more current file */
                }
            }
        }
        else    /* cannot read from the file */
        {
            zabbix_log(LOG_LEVEL_WARNING, "cannot read from [%s]: %s",
                    logfile_candidate, zbx_strerror(errno));
            break;  /* must return, situation could have changed */
        }
    }
    else    /* cannot position in the file */
    {
        zabbix_log(LOG_LEVEL_WARNING, "cannot set position to [%li] for [%s]: %s",
                *lastlogsize, logfile_candidate, zbx_strerror(errno));
        break;  /* must return, situation could have changed */
    }
}   /* trying to read from logfiles */

forループ内でここまでで決めたインデックスiを使って、logfiles[i]以降にあるログファイル全てを読みにいこうとしています。つまり、ログローテーションしてmessagesがmessages.1になった場合、先にmessages.1の残りの部分を読んでから、新しいmessagesファイルを読みに行こうとします。

その後にあるファイル情報の取得、lastlogsizeの処理、64KBづつログファイルを読み込んでutf8変換などの処理はlog[]キーと同様です。少し異なるのは、ファイルのmtimeを変数に保存しておいたり、ファイルの末尾まで読んだときにlogfiles配列に次のファイルが残っていたら、続けて次のファイルを先頭から(lastlogsize=0)読もうとする点です。

valueに読み込まれた文字、lastlogsizeの値の処理はlog[]キーと同様に処理されます。logrt[]の場合はmtimeもlastlogsizeと同様にactive_metrics配列に保存されます。

2012年2月12日日曜日

ラトビアでスノーボードに行ってきました

会社の人に誘われて、ラトビアでスノーボードに行ってきました。

行ってきたのはリガから80キロほど離れたCēsisという街の近くにあるŽagarkalnsというスキー場です。ほかにもリガから50キロほど離れたSiguldaにもスキー場があるらしいのですが、スノーボードにはŽagarkalnsの方が良いんだそうです。

先週末が一番寒い時期だったようで、リガでも最低気温が-30度近くまで下がりました。今週は寒くても-20度くらい、昼間は-10度くらいになるので一時期よりは暖かくなりましたが、それでも寒いことには変わらないです。Cēsisは少し内陸部にあるので、リガよりは少し寒くなります。

スキー場の木もとても寒そうなことになっています。

http://farm8.staticflickr.com/7061/6863963243_89d345f09d.jpg

スキー場はそれなりに混雑していました。スキーヤーの方が多く、スキーとスノーボードの割合が7:3くらいの割合でしょうか。

http://farm8.staticflickr.com/7189/6863961989_e421eb2884.jpg

到着したのが昼の1時過ぎくらいと遅めだったこともあってか、スノーボードの板は借りれたもののウェアを借りることができず、普段着のまま滑ることになってしまいました。ウェアは数が少ないので借りれないかもしれない、と前日に聞いてはいたので覚悟はしていたのですが、転ばないように気をつけながらになるので、あまり思い切りすべれないのが残念です。

ちなみに、ラトビアは日本と違って山がありません。一番標高の高いところで海抜300mくらいなんだそうです。300mといえば東京タワーと同じくらいですね。

なので、スキー場といっても日本ほど長いコースはなく、短いところで1分くらい、長くても3〜5分で滑りきってしまうくらいの長さです。ところどころ急な斜面もあったり、ジャンプ台のようなものもあったりと、コース自体は楽しめる作りになっていました。

http://farm8.staticflickr.com/7208/6863966059_b7538c7372.jpg

コースの一番下にあった開けた場所。これは川が凍ってるんだそうです。名前を聞かなかったので分からないのですが、川幅から察するに年末にボートツアーに行った川なんじゃないかと思います。

http://farm8.staticflickr.com/7206/6863967835_32634a3ab2.jpg

滑り始めたのが遅かったこともあり、2時間くらい滑ったところで日が暮れ始めたので、Cēsis市内に戻って食事してから帰ろうということになりました。

今年初めてのスノーボードだったので2時間でも十分楽しめました。普段着で転倒しないように注意しながらだったので思い切り滑れなかったのが残念でした。今日は宿が取れずに日帰りになってしまったので、次回は早めに宿を確保して1泊で来たいね、と話しながらCēsisに向かいました。

Cēsisでピザを食べて、少し周辺を歩いてからリガに向かうことになりました。これはCēsis市内の中心にあるモニュメント。

http://farm8.staticflickr.com/7036/6863969079_5e6625c18c.jpg

これはヴェンデン城跡です。昼間は中に入って見学できるんだそうです。

http://farm8.staticflickr.com/7177/6863970177_9a85c80e6b.jpg

Cēsisの古い町並み

http://farm8.staticflickr.com/7061/6863971257_91038ca5be.jpg

今回スノーボードに誘ってくれた人は、Cēsisはラトビアの中でも一番好きな街の一つだと言っていました。今回は夜も遅く、寒かったのであまり見て回れませんでしたが、次回は暖かいときにゆっくり観光に来てみたいと思います。

2012年1月1日日曜日

ラトビアのボートツアーと年越しパーティ

いよいよ2011年も最後、特に予定もないけれど年末年始はどう過ごそうかと考えていたときに、会社の同僚からボートツアーに誘われました。この寒い時期にボートツアー?と最初は断っていたのですが、ぜひ来なよ、という誘いもあって行ってみることにしました。

実は夏前くらいから何度となくボートツアーに誘われていたのですが、誘ってくれていた人が忙しくタイミングを逃していました。今の気温はそれほど低くないし、次回の春先にあるツアーは今よりも寒くて雪解け水で川の流れも早くなってより濡れるから、今回の条件はそれほど悪くないよ、とのことでした。

当日の朝は快晴にはならなかったものの、気温もそれほど低くなく風も穏やかな日になりました。正確な気温は覚えていないですが、最高気温5度、最低気温0度くらいだったと思います。私たちは車を持っていないので、誘ってくれた同僚の知り合いにリガ市内まで迎えに来てもらい、一旦同僚の家で準備をしてから出発地まで向かいました。

出発地はCesisという街の近く、リガの中心地から北東に100キロほど離れた場所です。車で1時間くらいのドライブの間、同僚はずっとビールを飲みっぱなし。私も一緒に飲んでいたのですが、彼は自宅で準備している間も飲んでいたので、到着までに500mlのボトルを3-4本開けてたんじゃないだろうかという勢いです。ラトビア人恐るべし。

これから下る川です。かなり緩やかな流れで安心しました。ラトビアは12月にもなると気温も氷点下になり、このあたりも雪で覆われているのが普通で、今年の気温は記録的に暖かいんだそうです。

http://farm8.staticflickr.com/7029/6614851409_0fe4b5c37f.jpg

みんなで協力してボートの準備。ゴムボートを足踏みタイプの空気入れで膨らましているところ。

http://farm8.staticflickr.com/7169/6614850653_a87c126085.jpg

念のためのライフジャケットを着ていざ出発です。ある程度着込んでいたことと、オールを漕ぐので寒さは全く感じませんでした。時期も時期なので両岸に動物を見ることはありませんでしたが、鳥が水面を泳いでいるのを見たり、ほとんど音のない中、森を両手にボートで進むのは久々に自然を満喫した気分でした。

http://farm8.staticflickr.com/7157/6614852545_804f1707a6.jpg

ボートから撮った夕日。今の時期ラトビアは日本よりも日が短く、4時くらいには日が沈んでしまいます。ボートに乗る前は2時間くらいで目的地に到着予定だったのですが(同僚はもっとかかるだろうと思っていたそうですが)、川の流れが緩いためか予定より時間がかかってしまい、急がないと日が暮れてしまいそうです。

http://farm8.staticflickr.com/7146/6614854477_945c9e2247.jpg

急がないと暗くなっちゃうねー、なんて話していると…急に空がどんよりしてきたかと思うと、小さな霰(あられ)が降ってきました。不吉な予感

http://farm8.staticflickr.com/7174/6614853429_a25cc0535e.jpg

最初の霰は小降りで一旦止んだのですが、2回目は本格的に降ってきました。

http://farm8.staticflickr.com/7151/6614855253_2a81f0c4e8.jpg

ボートの上もこんな状況

http://farm8.staticflickr.com/7003/6614856245_54640d5256.jpg

このあとは寒さと雪と日暮れのためあまり写真は撮れませんでした。最終的に霰は雪に変わり、予定より1-2キロほど早めに岸に上がって車で迎えにきてもらいました。迎えに来てくれた人は、こんな日にボートツアーに行くなんてクレイジーだと行っていましたし、実際に最後の方は大変でしたが忘れられない良い思い出になりました。後でGPSのデータを見てみると16.4キロのボートツアーでした。

ボートツアーから帰ってきたあと、ボートツアーに誘ってくれた同僚が自宅でパーティーをやるんだけど、よければ参加しない?と誘ってくれ、特に年越しのときの予定もなかったので参加させてもらうことにしました。

ボートツアーの出発の前にも少し寄らせてもらった同僚の家ですが、森の中の暖炉のある家、といういかにも北欧な感じのする素敵な家でした。

みんなで集まれるキッチンや、

http://farm8.staticflickr.com/7161/6621409387_76cc84142a.jpg

家の真ん中にある暖炉

http://farm8.staticflickr.com/7029/6621410525_7ea55635ea.jpg

2階には卓球台ががありました。

http://farm8.staticflickr.com/7026/6621408349_81fbc9535a.jpg

これは採ってきた草やハーブなどでお茶を作ってるんだそうです。

http://farm8.staticflickr.com/7157/6621933709_9d708f247b.jpg

ラトビアでは年越などイベントのときにはコイを食べるんだとか。スーパーなどでも水槽で泳いでいるのをよく見かけます。

http://farm8.staticflickr.com/7169/6614857219_d109bc689e.jpg

このコイにバター、レモン、ハーブ、ニンニクなどをつめて、ポテトと一緒にホイルに包み、

http://farm8.staticflickr.com/7155/6614857967_3be02bb545.jpg

オーブンで1時間くらい焼いてできあがり。

http://farm8.staticflickr.com/7016/6614860821_fde001174f.jpg

日本ではコイというとあまり美味しそうなイメージがないですが、白身魚のような全く癖のない味でとても美味しかったです。

他にもラトビアではよく食べられているサラダやチーズ、Laimaのチョコレートなどなど、色々な食事がありました。

http://farm8.staticflickr.com/7012/6621399723_6cb5a9141c.jpg

これは採ってきた野菜を使って作った手作りのピクルス。ラトビアでは色々なものをピクルスにして食べます。

http://farm8.staticflickr.com/7145/6621932365_fd100c275a.jpg

これはツナの入った何か。食べた感じはツナマヨのタコス巻きという感じでした。

http://farm8.staticflickr.com/7003/6614861837_26fe0d8b2a.jpg

ラトビアでよく食べられている黒いライ麦のパンです。これは中にナッツが入っていました。このパンにチーズや野菜、サラダなどを挟んで食べていました。

http://farm8.staticflickr.com/7034/6621402679_9f67b6dfee.jpg

ラトビアではちょうど年を越す12:00には皆で外にでてスパークリングワインを開けるんだそうです。その準備も万端。RIGASと書いてあるのがラトビア産のもので、お祝いごとがあると必ずといっていいほど飲まれています。味は甘めで癖がなく飲みやすいです。

http://farm8.staticflickr.com/7012/6614859919_fa7b39fff7.jpg

みんなで遅くまで飲んだり食べたりして楽しんで、この日はそのまま泊まらせてもらうことになりました。今日はボートツアーから年越しのパーティまで、ラトビアを満喫できた1日でした。

2011年12月26日月曜日

ラトビアのクリスマス

今日はクリスマスです。もちろんラトビアでもクリスマスをお祝いします。私たちは特に予定という予定もなかったので何かイベントがないかと市内に来てみました。

ここのところラトビアはずっと曇りの天気が続いていたのですが、クリスマスは久しぶりによい天気になりました。イブの夜には雪が降っていたものの、天気がよくなって昼には雪はほとんど残っていません。気温は低いので所々残った雪や水たまりが凍っている状態でした。

これは市内にあるロシア正教会のとなりの公園です。小さなお店がいくつか出ていました。

http://farm8.staticflickr.com/7170/6614738531_0642e56853.jpg

独立記念碑の近くにあるLaima(ラトビアで有名なお菓子メーカー)の時計もクリスマス仕様になっていました。

http://farm8.staticflickr.com/7027/6614739367_79751e8afa.jpg

リーガ大聖堂前の広場ではクリスマスマーケットが開催されていました。このマーケットがクリスマスのイベントとしては有名なもののようです。

http://farm8.staticflickr.com/7007/6614742175_603cfb0901.jpg

マーケットの真ん中には大きなクリスマスツリー。

http://farm8.staticflickr.com/7035/6614743391_d6a0ab1a74.jpg

クリスマスツリーの横にはサンタクロースもいました。

http://farm8.staticflickr.com/7012/6614744301_ff37b0c8f8.jpg

これは子供用のメリーゴーランド。木製のメリーゴーランドをおじさんが手で回してました。

http://farm8.staticflickr.com/7018/6614745403_83494cdb63.jpg

市庁舎前広場にも大きなクリスマスツリーが飾られていて、自由に飾り付けができるようになっていました。リガはクリスマスツリーを世界で最初に飾り付けた場所だという説もあるそうですが、他の地域でも昔から飾り付けていたという反論もあり本当かどうか分かりません。

http://farm8.staticflickr.com/7149/6614741279_af1c3884d1.jpg

少し町中をウロウロして、暗くなってから夜の市街地も散策してみました。町中には至るところで電飾が飾られていました。

http://farm8.staticflickr.com/7172/6614749825_28dfd55146.jpg

市庁舎もクリスマス仕様。

http://farm8.staticflickr.com/7005/6614746485_24902a3770.jpg

昼間にも来た市庁舎前広場の様子です。

http://farm8.staticflickr.com/7010/6614747367_09bc6aebc8.jpg

今年のクリスマスは土日だったので、イブ前日の23日に会社でもクリスマスをお祝いしました。こちらは会社のキッチンの様子。

http://farm8.staticflickr.com/7016/6619588173_5d948f3f35.jpg

何かお祝い事があると、会社ではいつもこのキッチンに集まってお茶やビール、シャンパンなどを飲みます。クリスマスのときはクッキーを食べつつお茶を飲んでいました。そのときの写真がZabbixニュースレターにも載っています。

このときに配られたのが下の金属製の動物の形をしたもの。このときに知ったのですが、ラトビアにも日本と同じ干支があります。中国発祥の干支はロシア経由で東ヨーロッパにも伝わっているんだそうです。12種類のキャラクターから選べるようになっていたので、来年の干支の辰(ドラゴン)を選んでみました。

http://farm8.staticflickr.com/7029/6619585455_2fd3af4dda.jpg

同僚がフォーチューンクッキーみたいなものだと、歯で噛んで開けると紙が入ってるんだと言うので最初は冗談かと思っていたのですが、みんなフォークやペンチを持ち出して本当にこじ開け始めたので、私も開けてみると…

http://farm8.staticflickr.com/7155/6619584505_e8772e2660.jpg

本当に入ってた!

ラトビア語なので読めないですが、Google翻訳で翻訳してみると"person starts to live only when he has exceeded himself"ということらしいです。

後で聞いたところによると、ラトビアにはロシアや旧ソ連時代の影響でクリスマスが3回あるんだそうです。12月25日がキリスト教のクリスマス、1月1日がソ連時代に宗教が排除されたために新年と合体したクリスマス、1月7日がロシア正教のクリスマスだとか。12月25から1月7日までずっとお祝いムードなんですね。

2011年12月5日月曜日

Zabbix SIAのパートナーシッププログラム

今ラトビアにいるためにあまり日本のユーザさんと話す機会もないため、このブログでZabbixパートナーシップについて説明しておこうと思います。本来ならZabbix SIAのサイトできちんと解説すべきなんでしょうけど、サイトは各国語の対応やらで修正するとなると大変なので、おいおい対応していくことにします。

Zabbixパートナーシップの詳細な権利や価格についてはZabbix SIAのサイトを参照してください。ここでは細かい話は置いておいて、パートナーシッププログラムとは何か、参加するとどういうメリットがあるか、についてざっくり説明しようと思います。

パートナーシップの種類

パートナーシップは大きく2種類があります。

  • リセラー: Zabbix SIAのサポート、およびその他のサービス(トレーニング、コンサルティングなど)を再販できるパートナー
  • 認定パートナー: リセラーの権利に加えて、Zabbixサポートの1次サポートを行うことができるパートナー

加えて、認定パートナーは独自にカスタマイズを加えたZabbixソフトウェアの提供や、独自のサポートメニュー(例としてはZabbix + その他のソフトウェアを組み合わせたサポートパックなど)を提供することも可能です。

サポートの流れとしては、リセラーが再販したサポートはZabbix SIAがエンドユーザのサポートを直接実施します。認定パートナーの場合はZabbix SIAが認定パートナーのサポートを行い、エンドユーザの問い合わせ先は認定パートナーという形になります。

パートナーシップのメリット

Zabbix SIAのサイトにもいろいろと細かいことは書かれていますが、技術的な点では、

  • Zabbix SIAにダイレクトに技術問い合わせ、バグ修正依頼、機能改善/追加要望ができる。
  • バグ報告や機能改善/追加要望で修正されたコードは必ずメインツリーに取り込まれる。細かな修正パッチを抱え込む(フォークする)ことによる管理の手間や、バージョンアップごとの追随遅れを減らすことができます。

あたりが大きなメリットになると思います。当然ですがZabbixのソース管理はZabbix SIAが行っているので、技術的に最も詳しいですし、今後の計画を考慮に含めた修正の相談が可能です。

営業やマーケティングのメリットとしては、

などがあると思います。

また、私がZabbix SIAで働いていますので、

  • 日本語による営業/技術サポートに対応しています

9月に日本向けパートナーシップの開始のプレスを出しましたが、これまでの英語版のパートナーシップは英語の対応のみ、日本語のパートナーシップは日本語対応が可能、という点が一番大きな違いです。

パートナーの技術サポートについて

技術サポートについては以下の方法で問い合わせが可能です。

  • Webベースの問い合わせ管理ツール
  • メール
  • 電話

3つあるのですが、ほとんどの場合はWebベースの問い合わせ管理ツールを利用してもらうことになります。コミュニティサポートでも利用しているZabbixサポートシステム内のプライベートアカウントからチケットを発行できます。

プライベートアカウントから登録されたチケットはコミュニティのものより優先して対応するようになっていますし、ソース管理のsubversionの修正履歴と連動しているので修正状況や修正箇所も分かりやすくなっています。

詳細については

簡単に紹介してきましたが、内容としては日本国内だと一般的なシステムインテグレータ企業がパートナーになることで最もメリットを感じてもらえるようになっていると思います。

今の時点でZabbix SIAが日本国内に直接サポートを販売することはしていないのですが、特に日本国内ではZabbix SIAのサポートを再販する会社はまだ存在していません。

Zabbix SIAで働いて半年以上経ちますが、日本国内からのバグ報告や機能追加要望などはまだまだ少ないと感じています。よりユーザーからの意見をソフトウェアに反映するべく、密に連携を取っていただける企業さんを募集しています。

ということで、興味を持っていただけたらZabbix SIAのお問い合わせフォームからご連絡頂ければと思います!