このトピックでは、アラート機能の使用方法を示す Java 向け Simple Log Service SDK のサンプルコードを提供します。
前提条件
Simple Log Service がアクティブ化されている。
Java 向け Simple Log Service SDK が初期化されている。詳細については、「Java 向け Simple Log Service SDK を初期化する」をご参照ください。
アラート監視ルールの管理
以下のサンプルコードは参考として提供されています。サンプルコードのパラメーターの詳細については、「アラートルールのデータ構造」をご参照ください。
import com.alibaba.fastjson.JSON;
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.*;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.*;
import com.aliyun.openservices.log.response.*;
import java.util.*;
public class App {
// Simple Log Service エンドポイント。
private static final String ENDPOINT = "cn-huhehaote.log.aliyuncs.com";
// この例では、AccessKey ID と AccessKey シークレットは環境変数から取得されます。
private static final String ACCESS_KEY_ID = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static final String ACCESS_KEY_SECRET = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Simple Log Service クライアントを作成します。
private static final Client client = new Client(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
private static final String PROJECT = "demo-alert";
private static final String ALERT_ID = "nginx-status-error";
private static void createAlert() throws LogException {
JobSchedule schedule = new JobSchedule();
schedule.setType(JobScheduleType.FIXED_RATE);
schedule.setInterval("1m");
AlertConfiguration configuration = new AlertConfiguration();
configuration.setVersion("2.0");
configuration.setType("default");
configuration.setDashboard("internal-alert-analysis");
Query query = new Query();
query.setStoreType("log");
query.setRegion("cn-huhehaote");
query.setProject(PROJECT);
query.setStore("nginx-access-log");
query.setQuery("status >= 400 | select count(*) as cnt");
query.setTimeSpanType(TimeSpanType.TRUNCATED);
query.setStart("-1m");
query.setEnd("absolute");
query.setPowerSqlMode("auto");
configuration.setQueryList(Collections.singletonList(query));
AlertConfiguration.GroupConfiguration groupConfiguration = new AlertConfiguration.GroupConfiguration();
groupConfiguration.setType("no_group");
configuration.setGroupConfiguration(groupConfiguration);
AlertConfiguration.SeverityConfiguration severityConfiguration = new AlertConfiguration.SeverityConfiguration();
severityConfiguration.setSeverity(AlertConfiguration.Severity.Medium);
AlertConfiguration.ConditionConfiguration conditionConfiguration = new AlertConfiguration.ConditionConfiguration();
conditionConfiguration.setCondition("cnt > 0");
conditionConfiguration.setCountCondition("");
severityConfiguration.setEvalCondition(conditionConfiguration);
configuration.setSeverityConfigurations(Collections.singletonList(severityConfiguration));
AlertConfiguration.Tag serviceLabel = new AlertConfiguration.Tag();
serviceLabel.setKey("service");
serviceLabel.setValue("nginx");
configuration.setLabels(Collections.singletonList(serviceLabel));
AlertConfiguration.Tag titleAnno = new AlertConfiguration.Tag();
titleAnno.setKey("title");
titleAnno.setValue("Nginx Status Error");
AlertConfiguration.Tag descAnno = new AlertConfiguration.Tag();
descAnno.setKey("desc");
descAnno.setValue("Nginx Status Error, count: ${cnt}");
List<AlertConfiguration.Tag> annotations = new LinkedList<AlertConfiguration.Tag>();
annotations.add(titleAnno);
annotations.add(descAnno);
configuration.setAnnotations(annotations);
configuration.setAutoAnnotation(true);
configuration.setSendResolved(false);
configuration.setThreshold(1);
configuration.setNoDataFire(false);
configuration.setNoDataSeverity(AlertConfiguration.Severity.Medium);
AlertConfiguration.PolicyConfiguration policyConfiguration = new AlertConfiguration.PolicyConfiguration();
policyConfiguration.setAlertPolicyId("sls.builtin.dynamic");
policyConfiguration.setActionPolicyId("test-action-policy");
policyConfiguration.setRepeatInterval("1m");
policyConfiguration.setUseDefault(false);
configuration.setPolicyConfiguration(policyConfiguration);
Alert alert = new Alert();
alert.setName(ALERT_ID);
alert.setDisplayName("Nginx Status Error");
alert.setState(JobState.ENABLED);
alert.setSchedule(schedule);
alert.setConfiguration(configuration);
CreateAlertRequest request = new CreateAlertRequest(PROJECT, alert);
CreateAlertResponse response = client.createAlert(request);
System.out.println("[create alert] " + JSON.toJSONString(response));
}
public static void getAndUpdateAlert() throws LogException {
GetAlertRequest getAlertRequest = new GetAlertRequest(PROJECT, ALERT_ID);
GetAlertResponse getAlertResponse = client.getAlert(getAlertRequest);
System.out.println("[get alert] " + JSON.toJSONString(getAlertResponse));
Alert alert = getAlertResponse.getAlert();
alert.getConfiguration().getQueryList().get(0).setQuery("status >= 500 | select count(*) as cnt");
UpdateAlertRequest updateAlertRequest = new UpdateAlertRequest(PROJECT, alert);
UpdateAlertResponse updateAlertResponse = client.updateAlert(updateAlertRequest);
System.out.println("[update alert] " + JSON.toJSONString(updateAlertResponse));
}
public static void disableAndEnableAlert() throws LogException {
DisableAlertRequest disableAlertRequest = new DisableAlertRequest(PROJECT, ALERT_ID);
DisableAlertResponse disableAlertResponse = client.disableAlert(disableAlertRequest);
System.out.println("[disable alert] " + JSON.toJSONString(disableAlertResponse));
EnableAlertRequest enableAlertRequest = new EnableAlertRequest(PROJECT, ALERT_ID);
EnableAlertResponse enableAlertResponse = client.enableAlert(enableAlertRequest);
System.out.println("[enable alert] " + JSON.toJSONString(enableAlertResponse));
}
public static void listAlerts() throws LogException {
ListAlertRequest request = new ListAlertRequest(PROJECT);
request.setOffset(0);
request.setSize(100);
ListAlertResponse response = client.listAlert(request);
System.out.println("[list alerts] " + JSON.toJSONString(response));
}
public static void deleteAlert() throws LogException {
DeleteAlertRequest request = new DeleteAlertRequest(PROJECT, ALERT_ID);
DeleteAlertResponse response = client.deleteAlert(request);
System.out.println("[delete alert] " + JSON.toJSONString(response));
}
public static void main(String[] args) throws LogException {
createAlert();
getAndUpdateAlert();
disableAndEnableAlert();
listAlerts();
deleteAlert();
}
}
アラートリソースデータの管理
以下のサンプルコードは参考として提供されています。サンプルコードのパラメーターの詳細については、「アラートリソースデータのデータ構造」をご参照ください。
import com.alibaba.fastjson.JSON;
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.*;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.*;
import com.aliyun.openservices.log.response.*;
import java.util.Collections;
public class App {
// Simple Log Service エンドポイント。
// リソースデータの場合、書き込み操作は中国 (河源) リージョンの Simple Log Service エンドポイントのみをサポートし、読み取り操作は他のリージョンの Simple Log Service エンドポイントをサポートします。
private static final String ENDPOINT = "cn-heyuan.log.aliyuncs.com";
// この例では、AccessKey ID と AccessKey シークレットは環境変数から取得されます。
private static final String ACCESS_KEY_ID = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static final String ACCESS_KEY_SECRET = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
private static final String USER_RESOURCE_NAME = "sls.common.user";
private static Client client = new Client(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
private static void createUser() throws LogException {
ResourceUser user = new ResourceUser();
user.setUserId("alex");
user.setUserName("Alex");
user.setEnabled(true);
user.setCountryCode("86");
user.setPhone("133****3333");
user.setEmail(Collections.singletonList("****@example.com"));
user.setSmsEnabled(true);
user.setVoiceEnabled(true);
ResourceRecord record = new ResourceRecord();
record.setId(user.getUserId());
record.setTag(user.getUserName());
record.setValue(JSON.toJSONString(user));
CreateResourceRecordRequest request = new CreateResourceRecordRequest(USER_RESOURCE_NAME, record);
CreateResourceRecordResponse response = client.createResourceRecord(request);
System.out.println("[create user]" + JSON.toJSONString(response));
}
private static void getUser() throws LogException {
GetResourceRecordRequest request = new GetResourceRecordRequest(USER_RESOURCE_NAME, "alex");
GetResourceRecordResponse response = client.getResourceRecord(request);
System.out.println("[get user]" + JSON.toJSONString(response.getRecord()));
}
private static void updateUser() throws LogException {
ResourceUser user = new ResourceUser();
user.setUserId("alex");
user.setUserName("Alex");
user.setEnabled(false);
user.setCountryCode("86");
user.setPhone("133****3333");
user.setEmail(Collections.singletonList("****@example.com"));
user.setSmsEnabled(true);
user.setVoiceEnabled(true);
ResourceRecord record = new ResourceRecord();
record.setId(user.getUserId());
record.setTag(user.getUserName());
record.setValue(JSON.toJSONString(user));
UpdateResourceRecordRequest request = new UpdateResourceRecordRequest(USER_RESOURCE_NAME, record);
UpdateResourceRecordResponse response = client.updateResourceRecord(request);
System.out.println("[update user]" + JSON.toJSONString(response));
}
private static void listUsers() throws LogException {
ListResourceRecordRequest request = new ListResourceRecordRequest(USER_RESOURCE_NAME);
request.setOffset(0);
request.setSize(100);
ListResourceRecordResponse response = client.listResourceRecord(request);
System.out.printf("[list users] count: %d, total %d, data %s",
response.getCount(), response.getTotal(), JSON.toJSONString(response.getRecords()));
}
private static void deleteUser() throws LogException {
DeleteResourceRecordRequest request = new DeleteResourceRecordRequest(USER_RESOURCE_NAME, "alex");
DeleteResourceRecordResponse response = client.deleteResourceRecord(request);
System.out.println("[delete user]" + JSON.toJSONString(response));
}
public static void main(String[] args) throws LogException {
createUser();
getUser();
updateUser();
listUsers();
deleteUser();
}
}
private static void createUserGroup() throws LogException {
ResourceUserGroup userGroup = new ResourceUserGroup();
userGroup.setGroupId("devops");
userGroup.setGroupName("DevOps チーム");
userGroup.setEnabled(true);
userGroup.setMembers(Collections.singletonList("alex"));
ResourceRecord record = new ResourceRecord();
record.setId(userGroup.getGroupId());
record.setTag(userGroup.getGroupName());
record.setValue(JSON.toJSONString(userGroup));
CreateResourceRecordRequest request = new CreateResourceRecordRequest("sls.common.user_group", record);
CreateResourceRecordResponse response = client.createResourceRecord(request);
System.out.println("[create user group]" + JSON.toJSONString(response));
}
private static void createWebhookIntegration() throws LogException {
ResourceWebhookIntegration dingtalk = new ResourceWebhookIntegration();
dingtalk.setId("dingtalk");
dingtalk.setName("DingTalk Webhook");
dingtalk.setMethod("POST");
dingtalk.setUrl("https://oapi.dingtalk.com/robot/send?access_token=**********");
dingtalk.setType("dingtalk");
// DingTalk チャットボットの追加署名の値。DingTalk チャットボットを作成するときにセキュリティ設定で追加署名を選択した場合は、このフィールドを構成する必要があります。追加署名の値は、DingTalk のチャットボット管理ページで取得できます。
// dingtalk.setSecret("SEC**********");
dingtalk.setHeaders(Collections.<ResourceWebhookIntegration.Header>emptyList());
ResourceWebhookIntegration wechat = new ResourceWebhookIntegration();
wechat.setId("wechat");
wechat.setName("WeChat Webhook");
wechat.setMethod("POST");
wechat.setUrl("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=**********");
wechat.setType("wechat");
wechat.setHeaders(Collections.<ResourceWebhookIntegration.Header>emptyList());
ResourceWebhookIntegration feishu = new ResourceWebhookIntegration();
feishu.setId("feisu");
feishu.setName("Feishu Webhook");
feishu.setMethod("POST");
feishu.setUrl("https://open.feishu.cn/open-apis/bot/v2/hook/**********");
feishu.setType("lark");
// Lark ボットの署名検証の設定値。Lark ボットを作成するときに、セキュリティ設定で署名検証の設定を選択した場合は、このフィールドを設定する必要があります。署名検証の設定値は、Lark のボット管理ページで取得できます。
// feishu.setSecret("**********");
feishu.setHeaders(Collections.<ResourceWebhookIntegration.Header>emptyList());
ResourceWebhookIntegration slack = new ResourceWebhookIntegration();
slack.setId("slack");
slack.setName("Slack Webhook");
slack.setMethod("POST");
slack.setUrl("https://hooks.slack.com/services/**********");
slack.setType("slack");
slack.setHeaders(Collections.<ResourceWebhookIntegration.Header>emptyList());
ResourceWebhookIntegration webhook = new ResourceWebhookIntegration();
webhook.setId("webhook");
webhook.setName("共通 Webhook");
webhook.setMethod("POST");
webhook.setUrl("https://example.com/***********");
webhook.setType("custom");
ResourceWebhookIntegration.Header authHeader = new ResourceWebhookIntegration.Header();
authHeader.setKey("Authorization");
authHeader.setValue("Basic YWRtaW46Zm9vYmFy");
webhook.setHeaders(Collections.singletonList(authHeader));
ResourceWebhookIntegration[] webhooks = {dingtalk, wechat, feishu, slack, webhook};
for (ResourceWebhookIntegration webhookIntegration: webhooks) {
ResourceRecord record = new ResourceRecord();
record.setId(webhookIntegration.getId());
record.setTag(webhookIntegration.getName());
record.setValue(JSON.toJSONString(webhookIntegration));
CreateResourceRecordRequest request = new CreateResourceRecordRequest("sls.alert.action_webhook", record);
CreateResourceRecordResponse response = client.createResourceRecord(request);
System.out.println("[create webhook integration] " + record.getId() + " " + JSON.toJSONString(response));
}
}
private static void createActionPolicy() throws LogException {
ResourceActionPolicy actionPolicy = new ResourceActionPolicy();
actionPolicy.setActionPolicyId("test-action-policy");
actionPolicy.setActionPolicyName("テストアクションポリシー");
actionPolicy.setPrimaryPolicyScript("fire(type=\"sms\", users=[\"alex\"], groups=[], oncall_groups=[], receiver_type=\"static\", external_url=\"\", external_headers={}, template_id=\"sls.builtin.cn\", period=\"any\")");
actionPolicy.setSecondaryPolicyScript("fire(type=\"voice\", users=[\"alex\"], groups=[], oncall_groups=[], receiver_type=\"static\", external_url=\"\", external_headers={}, template_id=\"sls.builtin.cn\", period=\"any\")");
actionPolicy.setEscalationStartEnabled(false);
actionPolicy.setEscalationStartTimeout("10m");
actionPolicy.setEscalationInProgressEnabled(false);
actionPolicy.setEscalationInProgressTimeout("30m");
actionPolicy.setEscalationEnabled(true);
actionPolicy.setEscalationTimeout("1h");
ResourceRecord record = new ResourceRecord();
record.setId(actionPolicy.getActionPolicyId());
record.setTag(actionPolicy.getActionPolicyName());
record.setValue(JSON.toJSONString(actionPolicy));
CreateResourceRecordRequest request = new CreateResourceRecordRequest("sls.alert.action_policy", record);
CreateResourceRecordResponse response = client.createResourceRecord(request);
System.out.println("[create action policy]" + JSON.toJSONString(response));
}
private static void createAlertPolicy() throws LogException {
ResourceAlertPolicy alertPolicy = new ResourceAlertPolicy();
alertPolicy.setPolicyId("test-alert-policy");
alertPolicy.setPolicyName("テストアラートポリシー");
alertPolicy.setParentId("");
alertPolicy.setGroupScript("fire(action_policy=\"test-action-policy\", group={\"alert.alert_id\": alert.alert_id}, group_by_all_labels=true, group_wait=\"15s\", group_interval=\"5m\", repeat_interval=\"1h\")");
alertPolicy.setInhibitScript("");
alertPolicy.setSilenceScript("");
ResourceRecord record = new ResourceRecord();
record.setId(alertPolicy.getPolicyId());
record.setTag(alertPolicy.getPolicyName());
record.setValue(JSON.toJSONString(alertPolicy));
CreateResourceRecordRequest request = new CreateResourceRecordRequest("sls.alert.alert_policy", record);
CreateResourceRecordResponse response = client.createResourceRecord(request);
System.out.println("[create alert policy]" + JSON.toJSONString(response));
}
private static void createContentTemplate() throws LogException {
ResourceContentTemplate.Template sms = new ResourceContentTemplate.Template();
sms.setLocale("zh-CN");
sms.setContent("");
ResourceContentTemplate.Template voice = new ResourceContentTemplate.Template();
voice.setLocale("zh-CN");
voice.setContent("");
ResourceContentTemplate.Template email = new ResourceContentTemplate.Template();
email.setLocale("en-US");
email.setSubject("SLS アラート");
email.setContent("");
ResourceContentTemplate.Template dingtalk = new ResourceContentTemplate.Template();
dingtalk.setLocale("zh-CN");
dingtalk.setTitle("SLS アラート");
dingtalk.setContent("");
ResourceContentTemplate.Template wechat = new ResourceContentTemplate.Template();
wechat.setLocale("zh-CN");
wechat.setTitle("SLS アラート");
wechat.setContent("");
ResourceContentTemplate.Template lark = new ResourceContentTemplate.Template();
lark.setLocale("zh-CN");
lark.setTitle("SLS アラート");
lark.setContent("");
ResourceContentTemplate.Template slack = new ResourceContentTemplate.Template();
slack.setLocale("zh-CN");
slack.setTitle("SLS アラート");
slack.setContent("");
ResourceContentTemplate.Template webhook = new ResourceContentTemplate.Template();
webhook.setLocale("zh-CN");
webhook.setSendType("single");
webhook.setLimit(0);
webhook.setContent("");
ResourceContentTemplate.Templates templates = new ResourceContentTemplate.Templates();
templates.setSms(sms);
templates.setVoice(voice);
templates.setEmail(email);
templates.setDingtalk(dingtalk);
templates.setWechat(wechat);
templates.setLark(lark);
templates.setSlack(slack);
templates.setWebhook(webhook);
String templateId = "test-template";
String templateName = "テストテンプレート";
Map<String, Object> contentTemplate = new HashMap<String, Object>();
contentTemplate.put("template_id", templateId);
contentTemplate.put("template_name", templateName);
contentTemplate.put("templates", templates);
ResourceRecord record = new ResourceRecord();
record.setId(templateId);
record.setTag(templateName);
record.setValue(JSON.toJSONString(contentTemplate));
CreateResourceRecordRequest request = new CreateResourceRecordRequest("sls.alert.content_template", record);
CreateResourceRecordResponse response = client.createResourceRecord(request);
System.out.println("[create content template]" + JSON.toJSONString(response));
}
関連情報
API 操作の呼び出し後に Simple Log Service から返された応答にエラー情報が含まれている場合、呼び出しは失敗します。API 呼び出しの失敗時に返されるエラーコードに基づいてエラーを処理できます。詳細については、「エラーコード」をご参照ください。
Simple Log Service は Alibaba Cloud SDK とも互換性があります。詳細については、Simple Log Service_SDK Center_Alibaba Cloud OpenAPI Explorer をご参照ください。
Simple Log Service は、Simple Log Service での自動構成の要件を満たすコマンドラインインターフェイス (CLI) を提供します。詳細については、「Simple Log Service CLI の概要」をご参照ください。
サンプルコードの詳細については、GitHub のAlibaba Cloud Simple Log Service SDK for Java をご参照ください。