【技術メモ】Spring MicrometerとPrometheusとGrafanaで可視化
概要
あとで清書。とりあえずメモ。
Additional features to help you monitor and manage your application in production.
本番環境でアプリケーションを監視および管理するのに役立つ追加機能。
詳細
Actuator/Micrometer
- InitialzrでActuatorとWebを指定(Webは無くてもMicrometerは動く。)
- Prometheusプラグインをpomに追加(バージョン指定は不要。)
- application.propertiesでactuatorのエンドポイント有効化
- Spring Boot 起動。(/actuator/prometheusが動いているはず。)
Actuator用のポートは分けたほうがよさそう。
Prometheus/Grafana
- docker用にループバックアドレスを設定
- prometheus.ymlを準備
- prometheusのイメージをdocker run、prometheus.ymlをボリューム指定
- http://localhost:9090/にアクセス
参考リンク
MicrometerとPrometheusを使うサンプル
プラスGrafana
docker でprometheus動かす
localのコンテナからlocalのホストのWebサービスにアクセスする
さらに補足
Adminとの棲み分けはどうなるんだろう
- actuatorのエンドポイントごとの認可もできるので安全みたいなメリットはない
- BootAdminはBootに特化というか限定されちゃうのがデメリット
- お手軽さはメリット
- Prometheus/ Grafanaはいろんなメトリクスを集約できるのがメリット
- サーバ台数増えてもパフォーマンス良い
1.5からの変更点
【技術メモ】Dockerからlocalhostに繋ぐときのIPを設定する
Dockerからlocalhostに繋ぐときのIPを設定する
概要
MacでDockerで何かサービスを立ち上げて、ホストOS側の何かにアクセスしたいとき、localhostだと繋がらない。
(コンテナ内に接続に行ってしまう。)
詳細
先にコマンド。Dockerからはこのアドレスを指定すればOK。
### 設定 $ sudo ifconfig lo0 alias 10.200.10.1/24 ### 確認 $ ifconfig lo0
- lo0はloopback(ループバック)のこと
- ホストOSにて$ ifconfig lo0とするとinet 127.0.0.1 netmask 0xff000000とでる
- 上記方法だと、OS再起動のたびにリセットされる
参考リンク
【技術メモ】apacheからtomcat に転送する
apache-tomcat転送設定
概要
- tomcatをインストールした
- apacheはすでに入っている(80ポートで使ってる)
- apacheはそのままでtomcatのパスへのアクセスだけ8009へ転送したい
- ※8080はhttpのポート、ajpはデフォルトで8009ポート
詳細
転送方式は3つ
転送できればいいので、とりあえず真ん中を使う。
httpd.conf mod_proxy_ajpが有効かを確認 ※デフォルトで有効のはず
$ view /etc/httpd/conf/httpd.conf (省略) LoadModule proxy_module modules/mod_proxy.so (省略) LoadModule proxy_ajp_module modules/mod_proxy_ajp.so (省略)
設定ファイルを生成
$ vi /etc/httpd/conf.d/reverse_proxy.conf ProxyPass /"<任意のパス>"/ ajp://localhost:8009/"<任意のパス>"/
再起動でOKのはず
参考リンク
【技術メモ】ECS+Fargateでコンテナバッチ処理
ECS+Fargateでコンテナバッチ処理
概要
前提知識
ECS
ECS = EC2 Container Service
クラスタ・タスク・サービスの概念から成る
www.slideshare.net
ECR
AWSが提供するコンテナのリポジトリのこと。DockerHubみたいなもの。
Fargate
- 誤解を恐れずにいうと、利用する時間だけ起動できるEC2。
- 誤解を恐れずにいうと、時間制限がなく、リソースも豊富なLambda。
- 誤解を恐れずにいうと、手軽なAWS Batch。
www.slideshare.net
詳細
- Dockerfileを用意。
- docker build && run && commit && tag。じゃなくてもいいけどimageの用意。
- imageをECRに登録。
- ECSにCluster作成、タスク定義、サービス登録。
Dockerfileで、バッチ処理が起動するようにしておくことで、ECSのサービス起動と同時にバッチ処理が動くという寸法。のはず。
【技術メモ】SpringSleuthでログにトレースIDを出す
SpringSleuthでログにトレースIDを出す
概要
Spring Sleuthを使って、ログにトレースIDを出す。Zipkinは無い想定。
実際に実装したサンプル
link chamc1984のGitHub
手順
- Mavenの依存性を追加
- ログフォーマットでtraceIdが出るように指定
詳細
Mavenの依存性を追加
SpringBootのイニシャライザでSleuthを追加すればOK。手で入れるなら多分以下。
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.RC2<</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
ログフォーマットでtraceIdが出るように指定
「%X」と打つだけで諸々出るが、出過ぎるので個別に指定する
- %X{traceId}
- %X{spanId}
ID打ちたいだけならこれで十分のはず
参考リンク
link Spring公式
【技術メモ】簡単3-Stepで、LogBack+SLF4Jでログを出力する
LogBack+SLF4Jでログを出力する
概要
Javaで、LogBackとSLF4Jで、ログを出すまでの手順
ステップ
詳細
Mavenの依存性を追加
logback-classicを追加すれば、ほぼほぼ入る。あとslf4j-simple
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency>
logback.xmlを用意
- appender で出力先を設定
- logger で出力対象のロガーを指定(対象パッケージを指定)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE logback> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/usr/local/var/log/myapp/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/usr/local/var/log/myapp/app.log.%d{yyyyMMdd}</fileNamePattern> <maxHistory>14</maxHistory> </rollingPolicy> <encoder> <!-- %Xだけにすると「traceId=xxx,spanId=xxx,spanExportable=false,X-Span-Export=false,X-B3-SpanId=xxx,X-B3-TraceId=xxx」が出る --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}^%-5level^%logger{0}:%L^%X{traceId}^%X{spanId}^%msg%n</pattern> </encoder> </appender> <logger name="xyz.chamc" level="info" additivity="false"> <appender-ref ref="FILE" /> </logger> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration>
Loggerを宣言して、ログ出力
- org.slf4j.Loggerをstatic finalで宣言
- org.slf4j.LoggerFactoryで引数に自分のクラスを指定
- ここは一意に名前がつけばいいので、自クラス名が手っ取り早い
- logger.xxx()でログ出力を実装
package xyz.chamc.example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SpringBootApplication @RestController @RequestMapping("/api") public class TheController { private static Logger logger = LoggerFactory.getLogger(TheController.class); @RequestMapping("/call") public String call() { logger.info("START: call()."); logger.info("END: call()."); return "You call API !"; } }
参考リンク
SpringBootでいつも出るWARNの対処法
【技術メモ】Javaのロガーについてメモ
Javaのロガーについてメモ
概要
Log4jと、Commons Loggingと、LogBackと、SLF4Jの違いやあれやこれや。
すぐ忘れるので、思い出す用のメモ。詳しくは参考リンクへ。
前提
- 「ロガー」と「ラッパー」の組み合わせでログを出力する
とりあえずラッパーで書いておけば、実装(ロガー)は後から変えられる。
ロガー
Log4j
- 様々な出力先が選択できる
- ログの出力レベルやログフォーマットを設定で切替できる
3つの要素からなる
- Logger:AppenderとLogLevelの指定
- Appender:出力先の指定
- Layout:出力形式の指定
※ この用語と概念を覚えておくと理解しやすい。
LogBack
Log4jの後継、つまり、より便利になったもの
特徴
ラッパー
Commons Logging
複数のログライブラリに対してラッパーとして機能するライブラリ
もうあんまり使われないので省略。
SLF4J
SLF4J:Simple Logging Facade for Java
参考リンク
- link javaのロガーが多すぎて訳が解らないので整理してみました
- link Java ログ出力パターン