Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Monitoring Containerized Elixir
Search
さっちゃん
September 07, 2019
Programming
1
990
Monitoring Containerized Elixir
#ElixirConfJP #CastleConf
さっちゃん
September 07, 2019
Tweet
Share
More Decks by さっちゃん
See All by さっちゃん
みんなのオブザーバビリティプラットフォームを作ってるんだがパフォーマンスがやばい #mackerelio #srenext
ne_sachirou
0
1.5k
作ってよかったgraceful shutdownライブラリ #kyotogo
ne_sachirou
0
1.3k
path 依存型って何?
ne_sachirou
0
660
野生の onbording と onbording 設計 #kyototechtalk
ne_sachirou
0
640
メトリックはいかにして見え續ける樣になったか #devio2022
ne_sachirou
0
94
名實一致
ne_sachirou
0
670
まかれるあなとみあ ―Mackerel のしくみを理解する 30 分― @ Hatena Engineer Seminar #16
ne_sachirou
0
3.1k
tacit programming : Point-free, Concatenatives & J
ne_sachirou
0
1k
Let's create stateful systems, by Elixir
ne_sachirou
1
950
Other Decks in Programming
See All in Programming
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
250
バイブコーディング超えてバイブデプロイ〜CloudflareMCPで実現する、未来のアプリケーションデリバリー〜
azukiazusa1
3
780
副作用と戦う PHP リファクタリング ─ ドメインイベントでビジネスロジックを解きほぐす
kajitack
3
520
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
950
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
330
대규모 트래픽을 처리하는 프론트 개발자의 전략
maryang
0
110
What's new in Adaptive Android development
fornewid
0
130
Bedrock AgentCore ObservabilityによるAIエージェントの運用
licux
8
560
なぜあなたのオブザーバビリティ導入は頓挫するのか
ryota_hnk
5
560
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
660
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
240
#QiitaBash TDDで(自分の)開発がどう変わったか
ryosukedtomita
1
350
Featured
See All Featured
The Invisible Side of Design
smashingmag
301
51k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Code Reviewing Like a Champion
maltzj
524
40k
YesSQL, Process and Tooling at Scale
rocio
173
14k
It's Worth the Effort
3n
185
28k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
RailsConf 2023
tenderlove
30
1.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Embracing the Ebb and Flow
colly
86
4.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Balancing Empowerment & Direction
lara
1
530
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Transcript
Monitoring Containerized Elixir
.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆) @ Mackerel.io / Hatena.ne.jp
Imagine, you have a great Elixir app.
Imagine, you have a great Elixir app. And will be
working it on Docker
Imagine, you have a great Elixir app. And will be
working it on Docker on Kubernetes.
Why container, Docker? Container is an abstract layer over infrastructure.
It runs everywhere. It easy to create, share, transfer & run.
Why Kubernetes? K8s is a common language. K8s can run
every types of applications.
Elixir on Containers https://speakerdeck.com/ne_sachirou/elixir-on- containers s/:distillery/Mix.Release/
When you've deployed the app on K8s. How to monitor
it?
Why Monitoring? Is your app works well? Know how your
app works. What caused when your app is broken. Keep your app observable.
Liveness check Is your app is living or not?
K8s has liveness probe. --- apiVersion: apps/v1 kind: Deployment spec:
template: spec: containers: - name: app livenessProbe: httpGet: path: /ops/heartbeat port: 4000
How to check your app is live or not?
KomachiHeartbeat https://hex.pm/packages/komachi_heartbeat Vital monitoring Elixir Web application.
KomachiHeartbeat The name is originate from a great Rubygems :
https://rubygems.org/gems/komachi_heartbeat
Add KomachiHeartbeat. defmodule Example.Router do use Plug.Router plug(:match) plug(:dispatch) forward("/ops",
to: KomachiHeartbeat) end defmodule ExampleWeb.Router do use ExampleWeb, :router forward("/ops", KomachiHeartbeat) end
Check it. % curl http://localhost/ops/heartbeat heartbeat:ok Also available from Zabbix,
ALB health check or Mackerel's "External Http monitor (外形監視)".
Error collection Listening canary song.
Sentry https://sentry.io/ Collect & sort errors. Show the error environments:
stacktrace, HTTP params, app host, release ver… Assign & resolve issue. Integrate with Sass: Slack, GitHub…
Add https://hex.pm/packages/sentry in your app. defmodule Example.Application do use Application
def start(_type, _args) do Logger.add_backend(Sentry.LoggerBackend) … end defmodule Example.Router do use Sentry.Plug … end & add many metadata, by yourself (・﹏・)
Metrics monitoring Know the app behaviour & detect anomary.
Prometheus + Grafana + deadtrickster/beam-dashboards Beautiful. But to keep Prometheus
servers have many toils.
Mackerel https://mackerel.io
Add mackerel-container-agent as a sidecar. --- apiVersion: apps/v1 kind: Deployment
spec: template: spec: containers: - name: app … - name: mackerel-container-agent image: mackerel/mackerel-container-agent:latest imagePullPolicy: Always resources: limits: {memory: 128Mi} env: - {name: MACKEREL_CONTAINER_PLATFORM, value: kubernetes} - name: MACKEREL_KUBERNETES_KUBELET_HOST valueFrom: fieldRef: fieldPath: status.hostIP - name: MACKEREL_KUBERNETES_NAMESPACE valueFrom: fieldRef: {fieldPath: metadata.namespace} - name: MACKEREL_KUBERNETES_POD_NAME valueFrom: fieldRef: {fieldPath: metadata.name} - {name: MACKEREL_ROLES, value: example:app} envFrom: - secretRef: {name: mackerel}
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization … secretGenerator: - name: mackerel type:
Opaque files: [MACKEREL_APIKEY=secret/MACKEREL_APIKEY]
None
OK. I see container's metrics. How about BEAM metrics?
KomachiHeartbeat + mackerel- plugin-json https://hex.pm/packages/komachi_heartbeat Vital monitoring Elixir Web application.
https://github.com/mackerelio/mackerel-plugin-json Json custom metrics plugin for mackerel.io agent.
KomachiHeartbeat has /stats endpoint that returns app's stats in JSON.
mackerel-plugin-json posts any data gotten from JSON API as Mackerel custome metrics.
We have KomachiHeartbeat.BeamVital . https://github.com/ne- sachirou/ex_komachi_heartbeat/pull/29 (Sorry for under development.)
Add KomachiHeartbeat.BeamVital . defmodule TeijiBot.Router do use Plug.Router plug(:match) plug(:dispatch)
forward( "/ops", to: KomachiHeartbeat, init_opts: [vitals: [KomachiHeartbeat.BeamVital]] ) end
Configure mackerel-plugin-json. --- apiVersion: apps/v1 kind: Deployment spec: template: spec:
volumes: - name: mackerel-agent-config configMap: name: mackerel-agent-config containers: - name: app … - name: mackerel-container-agent image: mackerel/mackerel-container-agent:plugins … env: - {name: MACKEREL_AGENT_CONFIG, value: /etc/mackerel/mackerel.yaml} … volumeMounts: - name: mackerel-agent-config mountPath: /etc/mackerel readOnly: true
--- apiVersion: v1 kind: ConfigMap metadata: name: mackerel-agent-config data: mackerel.yaml:
| plugin: metrics: json: command: | mackerel-plugin-json \ -url="http://localhost:4000/ops/stats" \ -prefix='beam'
None
Current metrics : atom_count memory_ets_tables memory_system_bytes_total atom, binary, code, ets,
other port_count process_count (More, under development.)