備忘録

備忘録

Prometheus + Node exporter + Grafanaを利用してテレメトリデータをグラフ化する方法

Ⅰ. はじめに

タイトルの通り「Prometheus + Node exporter + Grafanaを利用してテレメトリデータをグラフ化する方法」です。

Ⅱ. 手順

1. 新規ディレクトリを作成する
mkdir telemetry
2. 新規ファイルを作成する

telemetry/prometheus/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["127.0.0.1:9090"]
  - job_name: "node"
    static_configs:
      - targets: ["127.0.0.1:9100"]

telemetry/docker-compose.yml

version: '3.8'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    network_mode: host
    expose:
      - 9090
    restart: unless-stopped
    volumes:
      - prometheus:/prometheus
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'
  grafana:
    image: grafana/grafana
    container_name: grafana
    network_mode: host
    expose:
      - 3000
    restart: unless-stopped
    volumes:
      - grafana:/var/lib/grafana
volumes:
  prometheus: {}
  grafana: {}
3. Dockerコンテナを起動する
docker-compose up -d
4. WebブラウザでPrometheusにアクセスする

Node exporter の接続状態を確認する

4. WebブラウザでGrafanaにアクセスする
URL http://127.0.0.1:3000
初期ユーザー名 admin
初期パスワード admin
5. GrafanaのデータソースにPrometheusを指定する


6. Grafanaにグラフを追加する


実行結果


留意点

  • ファイアウォール設定を適切に行う

ASP.NET Coreでレスポンスを圧縮する方法

Ⅰ. はじめに

タイトルの通り「ASP.NET Coreでレスポンスを圧縮する方法」です。

Ⅱ. 手順

1. サンプルプログラムを書く
Program.cs

using Microsoft.AspNetCore.ResponseCompression;
using System.IO.Compression;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression();
builder.Services.AddResponseCompression(options =>
{
  options.EnableForHttps = true;
  options.Providers.Add<BrotliCompressionProvider>();
  options.Providers.Add<GzipCompressionProvider>();
});

builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
  options.Level = CompressionLevel.Fastest;
});

var app = builder.Build();
app.UseResponseCompression();

app.MapGet("/api/test", () =>
{
  return "Hello world";
});

app.Run();

実行結果

Brotli
gzip

C#のシリアライズ、デシリアライズ方法まとめ

Ⅰ. はじめに

タイトルの通り「C#のシリアライズ、デシリアライズ方法まとめ」です。

例として以下クラスを利用します

public class User
{
  public required uint Id { get; set; }
  public required string Name { get; set; }
}

var users = new User[]
{
  new() {Id = 1, Name = "user001" },
  new() {Id = 2, Name = "user002" }
};

Ⅱ. まとめ

Newtonsoft.Json

var json = JsonConvert.SerializeObject(users);
users = JsonConvert.DeserializeObject<User[]>(json);

System.Text.Json

var json = JsonSerializer.Serialize(users);
users = JsonSerializer.Deserialize<User[]>(json);

System.Text.Json (UTF-8 Bytes)

var bytes = JsonSerializer.SerializeToUtf8Bytes(users);
users = JsonSerializer.Deserialize<User[]>(bytes);

MessagePack

var bytes = MessagePackSerializer.Serialize(users, ContractlessStandardResolver.Options);
users = MessagePackSerializer.Deserialize<User[]>(bytes, ContractlessStandardResolver.Options);

// private プロパティもシリアライズする場合は以下を指定する
// MessagePack.Resolvers.DynamicObjectResolverAllowPrivate.Options

MemoryPack

+ [MemoryPackable]
- public class User
+ partial class User
{
    public required uint Id { get; set; }
    public required string Name { get; set; }
}
var bytes = MemoryPackSerializer.Serialize(users);
users = MemoryPackSerializer.Deserialize<User[]>(bytes);

SQLでMySQLとMariaDBを判別する方法

Ⅰ. はじめに

タイトルの通り「SQLでMySQLとMariaDBを判別する方法」です

Ⅱ. 手順

1. 以下SQLを実行する
SHOW VARIABLES like '%version_comment%'

実行結果

MySQL version_comment MySQL Community Server - GPL
MariaDB mariadb.org binary distribution
Google Cloud SQL for MySQL (Google)

※Google Cloudでは期待する結果を得られない

C#でMySQLのジオメトリ記憶形式を読み取る方法

Ⅰ. はじめに

タイトルの通り「C#でMySQLのジオメトリ記憶形式を読み取る方法」です。

本記事では便宜上「ジオメトリ記憶形式」という単語を利用しますが正しい単語ではありません。
英語では「Internal Geometry Storage Format」と書かれています。

Ⅱ. 手順

1. MySQLでWKTからバイナリを生成する
/* 東京駅 山手線 */
/* 緯度 35.6809591 */
/* 経度 139.7673068 */
select ST_GeomFromText('POINT(35.6809591 139.7673068)', 4326)

/* 出力 */
/* E6 10 00 00 01 01 00 00 00 F3 7F FD C6 8D 78 61 40 F1 34 F4 AA 29 D7 41 40 */
2. C#を書く
var bytes = new byte[]
{
  0xE6, 0x10, 0x00, 0x00, // SRID (4326 = WGS84)
  0x01, // Byte order (1 = Little endian)
  0x01, 0x00, 0x00, 0x00, // Type (1 = Point)
  0xF3, 0x7F, 0xFD, 0xC6, 0x8D, 0x78, 0x61, 0x40, // Longitude
  0xF1, 0x34, 0xF4, 0xAA, 0x29, 0xD7, 0x41, 0x40, // Latitude
};

var span = bytes.AsSpan();
var srid = BitConverter.ToInt32(span.Slice(0, 4));
var byteOrder = (int)span.Slice(4, 1)[0];
var type = BitConverter.ToInt32(span.Slice(5, 4));
var longitude = BitConverter.ToDouble(span.Slice(9, 8));
var latitude = BitConverter.ToDouble(span.Slice(17, 8));

Console.WriteLine($"SRID: {srid}");
Console.WriteLine($"Byte order: {byteOrder}");
Console.WriteLine($"Type: {type}");
Console.WriteLine($"Latitude(緯度): {latitude}");
Console.WriteLine($"Longitude(経度): {longitude}");

実行結果

SRID: 4326
Byte order: 1
Type: 1
Latitude(緯度): 35.6809591
Longitude(経度): 139.7673068

FAQ

Q. 手順1で生成したバイナリはWKBですか?

A. いいえ

/* MySQL系 ジオメトリ記憶形式 */
select ST_GeomFromText('POINT(35.6809591 139.7673068)', 4326)
/* E6 10 00 00 01 01 00 00 00 F3 7F FD C6 8D 78 61 40 F1 34 F4 AA 29 D7 41 40 */

/* WKB */
select ST_AsWKB(ST_GeomFromText('POINT(35.6809591 139.7673068)', 4326))
/* 01 01 00 00 00 F1 34 F4 AA 29 D7 41 40 F3 7F FD C6 8D 78 61 40 */
Q. MariaDBでSRID 4326は対応していますか?

A. 対応していません
https://stackoverflow.com/a/73285842/4771485