New RelicのNerdGraphはGraphQLのAPIで、リソースを取得したり更新することができる。
curl -X POST https://api.newrelic.com/graphql \
-H 'Content-Type: application/json' \
-H 'API-Key: *****' \
-d '{ "query": "{ requestContext { userId apiKey } actor { user { name } } }" }' | jq
{
"data": {
"actor": {
"user": {
"name": "Taiki Sakamoto"
}
},
"requestContext": {
"apiKey": "*****",
"userId": "*****"
}
}
}
GraphiQL explorerで項目を選ぶとクエリが生成される。
クライアントライブラリから実行することもできる。structはtutoneというツールで GraphQLのスキーマとtemplateから自動生成されている。
package main
import (
"context"
"fmt"
"logging"
"os"
"github.com/newrelic/newrelic-client-go/newrelic"
"github.com/newrelic/newrelic-client-go/pkg/users"
)
func main() {
// Initialize the client.
client, err := newrelic.New(newrelic.ConfigPersonalAPIKey(os.Getenv("NEW_RELIC_API_KEY")))
if err != nil {
log.Fatal("error initializing client:", err)
}
query := `
query($queryName: String!) {
actor {
users {
userSearch(query: {scope: {name: $queryName}}) {
users {
id
email
name
}
}
}
}
}
`
var resp struct {
Actor struct {
Users struct {
UserSearch struct {
Users []users.User
}
}
}
}
variables := map[string]interface{}{
"queryName": "Sakamoto",
}
if err := client.NerdGraph.QueryWithResponseAndContext(context.TODO(), query, variables, &resp); err != nil {
log.Fatal("error query:", err)
}
fmt.Println(resp.Actor.Users.UserSearch.Users[0].Name) // => Taiki Sakamoto
}