ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

「Mackerel サーバ監視[実践]入門」を買ってみた - カスタムメトリックプラグイン開発手順メモ

Mackerel サーバ監視[実践]入門:書籍案内|技術評論社を買い、読み始めました。
Mackerelの魅力の一つとして、プラグインを自作して独自の監視項目を追加することがあります。

本書を参考に、カスタムメトリックプラグインを作り、Mackerelの画面に表示させてみました。
以下、その時の手順のメモです。詳細は方法は本書を参考にしてください。

前提条件

今回はMac上でプラグインを開発し、Amazon EC2 Linuxに配置して監視を行います。
予めMackerelのアカウントを用意し、EC2インスタンスにはmackerel-agentをインストールしておきます。
開発言語はGolangになります。

※ mackerel-agentのインスタンス手順は公式ヘルプを参考
エージェントをインストールする - Mackerel ヘルプ

開発手順

1. ソースを作成

本書の「5.2 カスタムメトリックプラグインを作る」を参考に、「mackerel-plugin-uptime」を写経します。
今回はバイナリの名前だけ「go-learning-mackerel-plugin-uptime」というように変更しました。

ソースについては本書や、以下のGithub上のソースを参考にできます。
mackerel-agent-plugins/mackerel-plugin-uptime at master · mackerelio/mackerel-agent-plugins · GitHub


2. EC2用にビルド

ソースをEC2用にビルドします。

$ GOOS=linux go build

3. mackerel-agent-pluginsをインストール

EC2にmackerel-agent-pluginsをインストールします。

$ sudo yum install mackerel-agent-plugins

4. mackerel-agent.confにプラグインを追加

/etc/mackerel-agent/mackerel-agent.confに以下を追加します。

[plugin.metrics.uptime]
command = "/home/ec2-user/golang/go-learning-mackerel-plugin-uptime" # 作成したプラグインのパス

5. mackerel-agentを再起動 or EC2を再起動

6. 作成したカステムメトリックを確認

Mackerelの監視画面のカスタムメトリックに、作成したメトリックが表示されていることを確認します。

f:id:UnderSourceCode:20180707190141p:plain

「Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド」をGolangで写経してみた - その2

前回に引き続き、Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド | マイナビブックスGolangで写経しています。
今回はChapter4をやってみました。

GitHub - SrcHndWng/go-learning-serverless-apps at chapter4


Twitterからデータを取得してKinesisに投げるアプリ(twitterToKinesis)については
CloudFormationでEC2を立ち上げ、アプリのデプロイ、起動までを行うようにしてみました。

Kinesisからイベントを受け取るLambda(kinesisToDynamo)については
Serverless Frameworkを使用している以外は、本に書かれている機能をそのまま実装しています。

「Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド」をGolangで写経してみた

Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド | マイナビブックスを読み始めました。
ただ読むだけではなく、Golangの勉強がてら、本で紹介されている処理を実装してみました。

実装言語は先に書いたようにGolang、デプロイ周りはServerless Frameworkを使っています。
とりあえずChapter3をやってみたので、以下のGitHubに載せました。

GitHub - SrcHndWng/go-learning-serverless-apps at chapter3

感想としては(まだChapter3までしかやってないけど)・・・
・本の内容については、AWSでのサーバレスのパターンについてソースと構成が丁寧に説明されていると思う
Golangで実装してみた感想は、数ない文字数・if != errによる明確なエラーへの対応が個人的には好み
という印象です。。。

GolangとServerless FrameworkでGraphQLのAPIを作成 + 動作確認してみる

Building a Golang GraphQL API on AWS Lambda - A man with no server - Mediumという記事を見つけました。
こちらを参考に、Serverless Frameworkを用いてGraphQLのAPIを作成してみました。

主なロジックは上記の記事とほぼ同様なのですが

  • デプロイ周りにServerless Frameworkを使ってみた
  • struct毎にファイルを分割してみた

などの改修を行なっています。

私が作ったソースは以下に上げてありソース自体の説明は不要かと思いますが、デプロイ方法と動作確認の方法について書いておきたいと思います。
GitHub - SrcHndWng/go-learning-graphql-serverless

デプロイ

  • Serverless Frameworkがインストールされていること
  • AWSのアカウントを持っていてクレデンシャルの設定が済んでいること

が前提となります。

githubからソースをcloneする、もしくは以下のコマンドでプロジェクトを作成します。

$ serverless create -u https://github.com/serverless/serverless-golang/-p プロジェクト名

プロジェクトのフォルダに移動してビルドします。

$ GOOS=linux go build -o bin/main

デプロイします。

$ serverless deploy

動作確認

curlAPIを叩いてもいいのですが、今回はGraphiQL.appを使用しました。
ちなみに実行環境はMacとなります。

GitHub - skevy/graphiql-app: Light, Electron-based Wrapper around GraphiQL

GraphiQL.appをインストールし、クエリとして以下のように入力して結果が返ってくれば成功です。

{
  person(id: 1002){
    id
    firstName
    lastName
  }
}

Golang + API GatewayでCRUDを実装してみた

AWS LambdaがGolangを正式サポートしてから暫く経ちました。
Serverless FrameworkもGolangでの実装をサポートしたようなので、タイトルにあるようにAPI Gatewayを使用したCRUDAPIを作成してみました。

Todoを登録・削除・参照するAPIのサンプルとなります。
先にも書きましたが、Serverless Framework、API Gateway + Lambda、データの格納先にはDynamoDbを使用します。

こちらが今回書いたソースです。
GitHub - SrcHndWng/go-todo-sample-api-gateway at v1.0.0


以下、今回作成したモノの備忘録?です。

URL構成について

APIのURL構成については、Serverless FrameworkのAPI Gatewayのサンプルを参考にしました。
examples/serverless.yml at master · serverless/examples · GitHub

mainとHandlerについて

GolangAPI Gateway + Lambdaを実装する場合、mainはHanderを呼び出していて、HandlerはWebサーバを起動しているようです。
なので、Handler内でリクエストのメソッドの種類とパスを判定し、処理を切り替えてみました。

テストについて

テストについては、現時点ではDynamoDbの値を直接参照・更新しています。(動作確認用に作っただけなので・・・)

データの採番について

DynamoDbのデータの採番については、テーブル内のデータ数 + 1 をしています。(これも実案件では採番テーブルなどで管理すべきかと思います・・・)

Visual Studio CodeでSpring Bootのデバッグをやってみる

最近はSpring Bootを再び触り始めたこともあり、タイトルにあるようなことをやってみました。

以下、手順とメモです。

Visual Studio Codeの設定

1. Java Extension Packのインストール

Visual Studio Code のコマンドパレットを起動し、「Install Extention」から「Java Extension Pack」をインストールします。

2. Spring Boot Java Supportのインストール

Visual Studio Codeに「Spring Boot Java Support」もインストールしました。(もしかしら不要かもです。。。)

3. lombokの参照設定

私はlombokを使用することが多いので、Visual Studio Codelombokを参照できるように設定しました。
「Code」-「Preferences」-「Settings」を起動し、自分の設定に以下の書式でlombok.jarのパスを記述します。

"java.jdt.ls.vmargs": "-javaagent:/path/to/lombok.jar -Xbootclasspath/a:/path/to/lombok.jar"

参考サイト Lombok support · redhat-developer/vscode-java Wiki · GitHub

これを行うと@Dataを着けたクラスのgetterを参照することはできました。

Sping Bootプロジェクトの実行

以下のサイトよりSpring BootのWeb APIのソースを取得してきました。
Getting Started · Building a RESTful Web Service with Spring Boot Actuator


サイト内で紹介されているgitよりソースを取得し、その中の「complete」フォルダをVisual Studio Codeで読み込みます。

1. 実行

F5を押すとデバッグが始まります。
ブレークポイントを貼ってみましたが、普通に止まって、変数の中身も見れるようです。

2. ビルドなど

以下を見るとMavenをサポートしているようです。
https://code.visualstudio.com/docs/java/java-tutorial
私はgradleを主に使用するのですが、ビルドはコマンドで行うことにしました。
プロジェクト内に.gradlewファイルがある場合、以下のコマンドでビルドやクリーンができます。<

$ ./gradlew build
$ ./gradlew clean

まとめ

Visual Studio Codeは動きが軽いことや、ターミナルが使いやすいことなどが気に入っています。
しばらく使ってみようかと思います。

Golangでテンプレートファイルを使った出力を行うチュートリアルをやってみた

はじめに

Golangでテンプレートファイルを使った出力を行うことについて扱われている
Using Go Templates | Gopher Academy Blog
をやってみました。

テンプレートについては今までも使ってはいましたが、改めて復習ということで。。。
チュートリアル形式の記事なのですが、簡単に内容について纏めてみたいと思います。

記事の目次、学べること

以下のことについて扱われています。

  • 導入部
    • Golangでテンプレートを扱うパッケージが以下の二種類であること。
      • text/template
      • html/template
  • "Actions"
    • テンプレートファイルの定義方法、文法についての説明。
  • "Parsing Templates"
    • templateパッケージの基本的な使い方について。
  • "Implementing Templates"
    • "Creating Web Pages using Templates"
      • html形式のテンプレートで出力するフォーマットを定義し、標準出力に出力するサンプル。
      • template.Newを使うと"template: "html-tmpl" is an incomplete or empty template"というエラーとなった。(なので私はtemplate.Newは使いませんでした)
    • "Customizing Command’s Output"
      • CLIアプリケーションで起動引数にテンプレートファイル名を指定する例。

まとめ

テンプレートを使用するケースとして、API・E-mail・Webサイトが挙げられていました。
この記事のサンプルも標準出力に出していたので、Webに限定することなく使うケースは多いかと思います。

以下、今回私が実装したソースです。"Parsing Templates"、"Implementing Templates"について実装してみました。
GitHub - SrcHndWng/go-learning-using-template