サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
iPhone 16
reiki4040.hatenablog.com
Amazon Linux 2から、常駐サービスはsystemdで扱われるようになりました。systemdで動かしているアプリケーションのログをfluentdに取り込んで、kibanaやらS3やらに流したいので方法を調べてみました。結論を先に言うと、fluent-plugin-systemdを使ってやりましょう。 systemdで動かしているサービスは、標準でjournaldに出力され、journalctlコマンドを使ってログを見ることができます。sshで繋いで見る分にはいいのですが、fluentdなどで収集して扱うにはどうすればいいかなと。今回はアプリケーションに手を入れられないケースで行ったので、アプリケーションに直接ファイルにログを吐く機構があれば、それを使ってファイルに出して、in_tailで読み込むのもありです。 ファイルに出してin_tailすれば良いのでは systemdで動作
※2021/04/06 動かなくなってた部分があったので対応を後半に追記しました。 先日、rnzooに機能を追加して、久しぶりにリリースをしようとしたら、色々動かなくなっててハマりました。しばらくやってなかったので、Rubyのバージョンアップや、hubコマンドの再設定などが必要でした。だいぶオレオレリリーススクリプトになっていたので、もうちょっと普遍的なフローでリリースできないかと思って調べました。 ちょうど先週、以下のGoReleaser+GithubActionsで決まり!というエントリが上がっていました。 tellme.tokyo たまたま、ちょっとしたツールを作る予定もあって、それを上記エントリのやり方で構成し、追加でhombrew-tap対応を行いました。 github.com 基本的な内容は、前述のエントリにわかりやすく書いてあるので、そちらを確認、全体はリポジトリを見てみてく
JSONはデータの表現形式です。表現はできますが、項目があるかや、型が何であるかを検査する仕組みはありません。*1 そのため、システムや実装が分かれている場合に、数値を期待しているが、JSONの表現上、数値か数字かがずれていることが起き得ます。どういうことかというと、"numeric":1234 (数値)なのか、"numeric":"1234" (数字)なのかが違う、または不定ということ。仕様の齟齬や、実装ミスなどで発生します。 動的型付け言語の場合、よしなに扱ってくれたりしますが、Goにそれをやられると型エラーが発生してしまいます。GoでJSONを読み込む場合、encoding/jsonパッケージのjson.Unmarshal()を使って、structに読み込む方法があります。しかし、stringで定義していたら、数値がNG、int系で定義していたら、数字がNGです。 stringは数値
AmazonLinux 2017.03にnginx乗せて稼働させてたら、なぜかメモリ使用量が、1日ちょっとで2GB後半にさしかかりました。cacheではなくusedを徐々に消費してたので、これは何かリークしてる疑い。 プロセス等を見てもメモリを使っているものもいないし、疑いのあるプロセスをrestartしても改善しませんでした。 何だろうなーと調べてみたらすぐ出てきました。特にAmazonLinuxは関係なし。 dev.classmethod.jp 上記ページと同じく、NSSの問題で、curlがdentryというディレクトリ階層構造の管理をしているキャッシュを多く消費してしまうと。curlでhttpsの監視が動いており、それが5分に1回なので、徐々にリークした様子。1時間に100MB程度ずつ増加していたようです。 回避策は、NSS_SDB_USE_CACHE=YESという環境変数を指定する
golangのHTTPサーバは、少量のコードで動くものを作ることができます。内部的には、net/httpパッケージのServerとHandlerで構成されます。 Serverは名前の通り、Serveするもので、HTTPをどのネットワークソースで提供するかを定義するものです。 Handlerは、HTTPリクエストを実際にどう処理するかを抽象化したinterfaceで、ServeHTTP(w http.ResponseWriter req *http.Request)を提供しています。 しかし、これらは簡易に使う場合、見えなくなっています。どうしてそうなっているかを理解することで、幾つかのテクニックを知ることができます。 コードが短くなる過程 よく例として出てくるHTTPサーバの実装例は以下のコードです。 通常版 package main import ( "net/http" ) func
kubectlコマンドとオプションでnginxをminikube上で動かしました。 今回は、コマンドで起動内容を指定するのではなく、定義ファイルを使って動かすようにします。定義ファイルにすることでgitで管理できるようになります。 コマンドの振り返り 以下のように起動して、接続できるようにしまていました。 # nginxの起動 kubectl run nginx --image=nginx:1.11 --port=80 # Macから接続できるように kubectl expose deploy nginx --name=nginx-nodeport --port=80 --target-port=80 --type="NodePort" これは実際に何をやっているかというと、Deploymentという機能を使ってnginxコンテナを起動し、Serviceを使ってnginxコンテナにアクセス
kubernetes(以降k8s)は、GKE(GoogleContainerEngine)を使うのが簡単らしいですが、とりあえずローカル実行できる環境が欲しくなったりします。 minikubeは、VirtualBoxなどの上にk8sの環境を構築してくれるツールです。今回はとりあえずMac上にk8s環境を作り、nginxを動かしてアクセスするところまでやってみます。 インストール 以下の2つのツールと関連するものをインストールします。 kubectl: k8sの操作を行うコマンド minikube: ローカルにk8s環境を作るコマンド kubectlのインストール gcloudコマンドでインストール管理できるので、gcloudコマンドを入れます。 ダウンロードページから、MacOS用の、tar.gzをダウンロードし解凍し、install.shを実行します。 tar xzvf google-c
perlメインで使ってるわけじゃないんですが、サーバ側の調査等でperlのワンライナーは便利なのでよく使います。 普段使ってない言語だと、配列の長さを取るだけで迷ってしまいます。 Javaなら、array.lengthや、List.size()、Pythonならlen()と、それぞれです。 調べてたら2個あって、1個は、長さじゃなくて最後のインデックスなのに気づかず、値は出るのに、なぜか1少ない・・・?とハマってました。 @array = ("abc", "def", "ghi"); # これは2 $#array # これは3 scalar(@array) コマンドマンドで確認 perl -e '@array=("abc","def","ghi"); print "$#array\nscalar(@array)' 2 3日常的に使わないと忘れますね。
Slackはincoming webhooksがあり、POSTするだけで、簡単にメッセージを送ることができます。 スクリプトで直接Incoming Webhook使ってもいいんですが、これ自体は別に認証も何もないので、誰かが知ってしまうと、好き放題投稿できます。そんな時に入れ替えたりする場合、いろんなスクリプトの設定に埋め込まれていて、方々に散っているのはちょっと辛いです。また、多言語環境の場合は、一定の処理を行う場合に各言語でライブラリ作るのもしんどいかなーということで、AWSのAPI Gateway + Lambdaを使って汎用化してみます。*1 Slackのteam、AWSアカウントはあるものとして、以下を行っていきます。 Slack Incoming Webhookの作成 AWS Lambdaでincoming Webhookを使う AWS API GatewayとLambdaを繋
JVMのヒープサイズが標準(デフォルト)でどれぐらいなんだろうと仕様を調べたのでメモ 最初 物理メモリの1/64 Xmsオプションで指定可 最大 物理メモリの1/4か1GBの小さい方 Xmxオプションで指定可 OracleのGarbage Collector Ergonomicsページ(英語) 自分のマシンだと2GBメモリが乗ってるので、単純計算で以下。 最初は2048MB/64=32MB 最大は2048MB/4=512MB ヒープ領域が必要なのだと、ちゃんとオプション指定するからあんまり気にしないかも。
golangでデーモンやWebサーバなどの設定再読み込みなどをどうしようかなと考えてた時に、fluentdがシグナルでいろいろやってたな*1と思ったので、golangだとどうやるか調べてみました。 全体はこれ 動作の確認 ビルドして実行ファイル作成 go build 実行します。(以降このターミナルをAとします) ./signal 他のターミナルからプロセスを確認します。(以降このターミナルをBとします) ps | grep signal 9999 ttys003 0:00:00 ./signal XXXX ttys003 0:00.00 grep --color signal BからSIGHUPシグナルを送ります kill -SIGHUP XXXX Aに、hungupが表示されます(実際はハングアップしてないです) hungup 今度は、AでCtrl+cを押すと、Warikomiと表示さ
Pythonをやっていて、with構文って何だろ?となって、理解できたので整理してみます。細かいところが違うかもしれませんが、動きはつかめるかなと思います。 Python3.3で動作確認しています。 with構文とは with構文は、ある機能の利用者が、より安全、簡潔にその機能を使えるようにする構文です。既知の定形終了処理であれば、機能作成側でそれをあらかじめ定義し、利用者はwith構文を使うだけで、安全に機能を使うことが出来ます。 with構文を使っていないファイル書き込み例 wfp = open('msg.log', 'w') wfp.write('need call close, if do not use with statement.') wfp.close() with構文を使ったファイル書き込み例 with open('msg.log', 'w') as wfp: wfp.w
シェル書いてて、配列全要素を利用したいときに、まんまループの書き方が良くわからなかったのでメモ。 ARRAY=(aaa bbb ccc) for item in ${ARRAY[@]}; do echo $item done これで、配列ARRAYの要素を全部出力できます。 なぜかというと、echo ${ARRAY[@]} するとわかります。 echo ${ARRAY[@]} #aaa bbb ccc それがfor文で、下記のようになるので、要素が全部回せます。 for item in aaa bbb ccc; do echo $item done ちなみに、{}をつけないと、配列の先頭要素+[@]という文字列扱いになってしまいます。 配列は名前だけだと先頭要素を表し、先に展開されるようで、[@]がただの文字列と解釈されるようです。 ARRAY=(aaa bbb ccc) echo $AR
サーバ環境を作る時に、VirtualBoxを使って仮想サーバを作るとしても、GUIで仮想マシン作って、起動してOSイメージ読み込ませて。。。とやってると非常に手間です。 そんなわけで、ちょっと前ぐらいから熱い感じのvagrantを使って、簡単に環境を作れるようにします。 環境(ちょっと前に試してたので、若干バージョンが古いです) OS MacOS Mountain Lion(10.8.2) VirtualBox 4.2.10 for MaxOSX) vagrant 1.1.5 vagrantの1.0,1.1系で違うようなので、今最新の1.2系もまた変わっているところがあるんでしょうか。 Vagrantにちゃんと載ってたりするので、そこはちゃんと読めば大丈夫かも。 準備 MacOS版のVirtualBox.dmgをダウンロード Downloads – Oracle VM VirtualBox
2013/10/24 追記 ちょっと前に、vagrantのバージョンを上げてみたら、saharaが動かなくなったんですが、今は以下のコマンドで入りました。 vagrant plugin install sahara MacOS Mervericks VirtualBox 4.3 Vagrant 1.3.5 sahara 0.0.16 参考 OSXにvagrantとsaharaプラグインをインストール - Qiita 追記ここまで - vagrantを使った簡単仮想サーバ環境の準備 - 年中アイス vagrantで複数の仮想サーバを作る - 年中アイス に引き続いて、saharaプラグインの紹介です。 Vagrant1.1に、本家Saharaが対応しない(というよりアップデートが止まっている)ので、ryuzeeさんが、1.1でも動くものを公開されています。 正式にサポートしてる訳ではないので
前回に引き続いて、複数台の仮想サーバ環境の作成を行います。 公式を参考に。 Multi-Machine - Vagrant Documentation 準備 適当なディレクトリを作成して、vagrant initする。ここは前回と変わりありません。 $ mkdir multi-server $ cd multi-server $ vagrant init Vagrantfileの編集 # Vagrantfile Vagrant.configure("2") do |config| # webという仮想サーバを定義 config.vm.define :web do |web| # 中は、以前と同じですが、config.vmとなっていたところがweb.vmとなっています。 web.vm.box = "base" web.vm.network :private_network, ip:"192.
2013/02/27追記 @tagomorisさんに無事pull requestマージしていただけました。ありがとうございます。 fluent-plugin-parserの0.2.2から使えるようになっています。 設定名をsuppress_parse_error_logに変更 テスト例をいただいて、無事テストコードも追加 初githubがRubyになるとは。今度、pull request周りをまとめたい。。。 とりあえずgithubはこれ見ながらやりました。 WEB+DB press vol.69 isbn:4774151041 追記ここまで。 ちょっと必要だったので、ついでにpull request投げられないかと模索中。 そもそもの経緯としては、綺麗でないログ(デバッグに近いログ)から、特定のフォーマットにマッチする行だけfluentdに乗せて、集計とかgrowthforecastに流
簡単にログを収集できるということで、目を付けていたfluentdにやっと手を出しました。 さくらVPSにカスタムOSでUbuntu12.04LTSを入れているので、そこに入れます。 まるっと入れられることもあって、TreasureData社が配布しているtd-agentを使います。 TreasureData社サポートページの通りで入ります。 $ curl -L http://toolbelt.treasure-data.com/sh/install-ubuntu-precise.sh | sh # install log...これで終わり。すごい簡単。 td-agent(fluentdも)の便利なコマンドたちが以下のディレクトリにあるので、.bashrcなどで、PATHに追加しましょう。 $ /usr/lib/fluent/ruby/bin/ b2json fluent-gem j2bso
Ubuntu12.04LTS にて、cpanmについては入っているものとして。 growthforecastがCPANに登録されたそうで、cpanmで入ります。 Ubuntuは、公式にあるようにapt-getで関連ツールをインストールして、cpanmで完了。(ちょっと時間かかります) $ sudo apt-get build-dep rrdtool $ sudo cpanm install GrowthForecastさて、growthforecastを使ってグラフ化しようにも、会社じゃないと試そうにも以下の問題が。。。 そんなにアクセスのあるWebサーバを持っていない マシンリソースもあんまり使ってない そもそも他のブログと同じようなことを書いても仕方ない といった問題がありまして、何をグラフ化しようかなーと。 Pythonの勉強がてら、どこかのWebAPIからデータを取ってそれを使って
このページを最初にブックマークしてみませんか?
『reiki4040.hatenablog.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く