tsalakh ain sus noam Huyah ol guf

勉強会のメモ。その他備忘録。参考にさせて頂いたサイトや資料はリンクさせて頂いていますが不都合があればご連絡ください。

【技術メモ】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


参考リンク

MicrometerとPrometheusを使うサンプル

qiita.com

プラスGrafana

qiita.com

docker でprometheus動かす

prometheus.io

localのコンテナからlocalのホストのWebサービスにアクセスする

qiita.com


さらに補足

peter.bourgon.org

Adminとの棲み分けはどうなるんだろう

qiita.com

  • actuatorのエンドポイントごとの認可もできるので安全みたいなメリットはない
  • BootAdminはBootに特化というか限定されちゃうのがデメリット
  • お手軽さはメリット
  • Prometheus/ Grafanaはいろんなメトリクスを集約できるのがメリット
  • サーバ台数増えてもパフォーマンス良い

1.5からの変更点

qiita.com


【技術メモ】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再起動のたびにリセットされる

参考リンク

link Docker for Macで立てたコンテナから、ホストOSで動いているAPIサーバーにアクセスする方法

【技術メモ】apacheからtomcat に転送する

apache-tomcat転送設定

概要

  • tomcatをインストールした
  • apacheはすでに入っている(80ポートで使ってる)
  • apacheはそのままでtomcatのパスへのアクセスだけ8009へ転送したい
  • ※8080はhttpのポート、ajpはデフォルトで8009ポート

詳細

転送方式は3つ

  • mod_jk : 古きよきやつ
  • mod_proxy_ajp : 最近のやつ、今のデフォルト
  • mod_proxy_http

転送できればいいので、とりあえず真ん中を使う。

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のはず

参考リンク

link Apache2.4とTomcat8を連携させる

【技術メモ】ECS+Fargateでコンテナバッチ処理

ECS+Fargateでコンテナバッチ処理

概要

  • バッチ処理をコンテナで定義
  • 必要な時に立ち上がって、終わったら破棄される
  • Fargateを使うことでEC2インスタンスすら不要

前提知識

ECS

ECS = EC2 Container Service

クラスタ・タスク・サービスの概念から成る

  • クラスタ=実行環境。ここではEC2とかFargateのこと。
  • タスク=クラスタ上で動かすコンテナのこと。
  • サービス=クラスタとタスクを紐づける。

www.slideshare.net

ECR

AWSが提供するコンテナのリポジトリのこと。DockerHubみたいなもの。

Fargate

  • 誤解を恐れずにいうと、利用する時間だけ起動できるEC2。
  • 誤解を恐れずにいうと、時間制限がなく、リソースも豊富なLambda。
  • 誤解を恐れずにいうと、手軽なAWS Batch。

www.slideshare.net

詳細

  1. Dockerfileを用意。
  2. docker build && run && commit && tag。じゃなくてもいいけどimageの用意。
  3. imageをECRに登録。
  4. 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で、ログを出すまでの手順

ステップ

  1. Mavenの依存性を追加
  2. logback.xmlを用意
  3. Loggerを宣言して、ログ出力

詳細

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, LogBack など
    • ラッパー
      • 開発者がコード上に書くもの
      • Commons Logging, SLF4J など

とりあえずラッパーで書いておけば、実装(ロガー)は後から変えられる。

ロガー

Log4j

  • 様々な出力先が選択できる
  • ログの出力レベルやログフォーマットを設定で切替できる

3つの要素からなる

  • Logger:AppenderとLogLevelの指定
  • Appender:出力先の指定
  • Layout:出力形式の指定

※ この用語と概念を覚えておくと理解しやすい。

LogBack

Log4jの後継、つまり、より便利になったもの

特徴

  • Log4jに比べて、速度が速く、メモリ消費が少ない
  • logback.xmlの内容は、log4j.xmlとほぼ同じ

ラッパー

Commons Logging

複数のログライブラリに対してラッパーとして機能するライブラリ

もうあんまり使われないので省略。

SLF4J

SLF4J:Simple Logging Facade for Java

  • 様々なロギングフレームワーク用のファサードを提供するライブラリ
  • クラスパスに存在するjarファイルによって、自動でロギング実装を変更できる

参考リンク