概要

詳しい説明はNAVERクラウドプラットフォームモニタリングAPI referenceをご参考ください。
ここでは簡単なシナリオを利用して、作成/運用中のサーバに対するモニタリング関連情報を照会します。 記述されたシナリオ通りやっていけば、モニタリングAPIの使用方法を習うことができます。

シナリオのご説明

所有しているサーバに対するモニタリング統計情報を照会します。

  1. サーバごとに提供可能なMetric情報の照会

    • サーバごとに統計情報を提供できるMetricにはどんなものがあるのかを照会します。
  2. Metric関連の統計情報の照会

    • 特定の期間におけるサーバ(複数のサーバ)のMetric統計情報を照会します。

認証

該当のガイドではシナリオ実行のための認証URLを作るプロセスを説明します。
Javaサンプルコードで作成され、GET方式のhttp request methodを使ってリクエストする方式で作成されました。
実際のリクエストの際はGET方式でリクエストするよりPOST方式でrequest bodyに値を入れてリクエストする方法をお勧めします。

認証URLの作成

次のような手順で認証キーを作成します。

base stringの作成

  1. アクションパラメータにbase stringの作成に必要な認証パラメータを追加
  2. リクエストのパラメータとvalueの値をアルファベット順に整列
  3. base string = RequestMethod + '&' + oauthEncode(requestUrl) + '&' + oauthEncode(queryString)

署名書の作成

Secret Keyと上で作成したbaseStringを持ってHMAC SHA-1ハッシュアルゴリズムを利用し、署名書を作成します。

リクエストURLの作成

署名書まで作成が完了したら、リクエストURLを作成して、APIをリクエストします。
OAuth外部のライブラリを利用して、authorizationヘッダにauthparamsを含ませて簡単にリクエストすることもできます。

詳しい内容はNcloud OAuth認証ガイドをご参考ください。

リクエストURL作成のjava sample code

次はリクエストURLを作成するjava sample codeです。
該当のコードはcommons-codec-1.4.jarライブラリにdependencyを持ちます。そのため、次のコードを実行するためには該当のjarが自分のbuild pathに追加されなければなりません。
該当のjarは簡単にgoogle.comやnaver.comで検索してダウンロードすることもできます。またはNAVERクラウドビズライブラリでdependency項目として一緒に提供されます。

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.net.URLCodec;

/**
 * @author admin
 */
public class OAuthMain {
    private static String consumerKey = "CCe2T0ilv4aO3kIevT3x";
    private static String consumerSecret = "UXbllHzrAVV7rmcE270sESJZa3Fh8I2kOiBTf0oE";

    public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
        String requestMethod = "GET";
        String requestUrl = "https://api.ncloud.com";
        String monitoringNameSpace = "/monitoring/";

        Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();

        requestParameters.put("action", Arrays.asList("getMetricStatistics"));
        requestParameters.put("instanceNoList.1", Arrays.asList("68745"));
        requestParameters.put("metricName", Arrays.asList("CPUUtilization"));
        requestParameters.put("startTime", Arrays.asList("2014-06-09T17:50:00+09:00"));
        requestParameters.put("endTime", Arrays.asList("2014-06-09T18:50:00+09:00"));
        requestParameters.put("period", Arrays.asList("1800"));
        requestParameters.put("responseFormatType", Arrays.asList("xml"));

        SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
        String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + monitoringNameSpace, significantParameters);
        String signature = sign(signatureBaseString, consumerSecret);
        String requestFullUrl = makeRequestUrl(requestUrl + monitoringNameSpace, significantParameters, signature);
        System.out.println(requestFullUrl);
    }

    /**
     * signature base stringと作るためのsignificateParameter設定
     * @param requestParameters
     * @param consumerKey
     * @return
     */
    private static SortedMap<String, SortedSet<String>> getSignificateParametersForSiganturBaseString(Map<String, List<String>> requestParameters, String consumerKey) {
        SortedMap<String, SortedSet<String>> significateParameters = convertTypeToSortedMap(requestParameters);

        SortedSet<String> consumerKeySet = new TreeSet<String>();
        consumerKeySet.add(consumerKey);
        significateParameters.put("oauth_consumer_key", consumerKeySet);

        SortedSet<String> nonceSet = new TreeSet<String>();
        nonceSet.add(generateNonce());
        significateParameters.put("oauth_nonce", nonceSet);

        SortedSet<String> signatureMethodSet = new TreeSet<String>();
        signatureMethodSet.add("HMAC-SHA1");
        significateParameters.put("oauth_signature_method", signatureMethodSet);

        SortedSet<String> timestampSet = new TreeSet<String>();
        timestampSet.add(generateTimestamp());
        significateParameters.put("oauth_timestamp", timestampSet);

        SortedSet<String> versionSet = new TreeSet<String>();
        versionSet.add("1.0");
        significateParameters.put("oauth_version", versionSet);

        return significateParameters;
    }

    /**
     * @param requestParameters
     * @param significateParameters
     */
    private static SortedMap<String, SortedSet<String>> convertTypeToSortedMap(Map<String, List<String>> requestParameters) {
        SortedMap<String, SortedSet<String>> significateParameters = new TreeMap<String, SortedSet<String>>();
        Iterator<String> parameterNames = requestParameters.keySet().iterator();
        while (parameterNames.hasNext()) {
            String parameterName = (String)parameterNames.next();
            List<String> parameterValues = requestParameters.get(parameterName);
            if (parameterValues == null) {
                parameterValues = new ArrayList<String>();
            }

            for (String parameterValue : parameterValues) {
                if (parameterValue == null) {
                    parameterValue = "";
                }

                SortedSet<String> significantValues = significateParameters.get(parameterName);
                if (significantValues == null) {
                    significantValues = new TreeSet<String>();
                    significateParameters.put(parameterName, significantValues);
                }
                significantValues.add(parameterValue);
            }

        }
        return significateParameters;
    }

    /**
     * @param url
     * @return
     */
    private static String normalizeUrl(String url) {
        try {
            URL requestURL = new URL(url);
            StringBuilder normalized = new StringBuilder(requestURL.getProtocol().toLowerCase()).append("://").append(requestURL.getHost().toLowerCase());
            if ((requestURL.getPort() >= 0) && (requestURL.getPort() != requestURL.getDefaultPort())) {
                normalized.append(":").append(requestURL.getPort());
            }
            normalized.append(requestURL.getPath());
            return normalized.toString();
        } catch (MalformedURLException e) {
            throw new IllegalStateException("Illegal URL for calculating the OAuth signature.", e);
        }
    }

    private static String generateTimestamp() {
        return Long.toString(System.currentTimeMillis() / 1000L);
    }

    private static String generateNonce() {
        return Long.toString((new Random()).nextLong());
    }

    /**
     * base string作成
     * @param requestMethod
     * @param requestUrl
     * @param significantParameters
     * @return
     */
    private static String makeSignatureBaseString(String requestMethod, String requestUrl, SortedMap<String, SortedSet<String>> significantParameters) {
        StringBuilder queryString = getRequestQueryString(significantParameters);

        requestUrl = normalizeUrl(requestUrl);
        requestUrl = OAuthCodec2.oauthEncode(requestUrl);

        return new StringBuilder(requestMethod.toUpperCase()).append('&').append(requestUrl).append('&').append(OAuthCodec2.oauthEncode(queryString.toString())).toString();
    }

    /**
     * query string作成
     * @param significantParameters
     * @return
     */
    private static StringBuilder getRequestQueryString(SortedMap<String, SortedSet<String>> significantParameters) {
        StringBuilder queryString = new StringBuilder();
        Iterator<Map.Entry<String, SortedSet<String>>> paramIt = significantParameters.entrySet().iterator();
        while (paramIt.hasNext()) {
            Map.Entry<String, SortedSet<String>> sortedParameter = paramIt.next();
            Iterator<String> valueIt = sortedParameter.getValue().iterator();
            while (valueIt.hasNext()) {
                String parameterValue = valueIt.next();
                queryString.append(OAuthCodec2.oauthEncode(sortedParameter.getKey())).append('=').append(OAuthCodec2.oauthEncode(parameterValue));
                if (paramIt.hasNext() || valueIt.hasNext()) {
                    queryString.append('&');
                }
            }
        }
        return queryString;
    }

    /**
     * base stringとconsumer secret keyを持ってsignature作成
     * @param signatureBaseString
     * @param consumerSecret
     * @return
     * @throws NoSuchAlgorithmException
     * @throws UnsupportedEncodingException
     * @throws InvalidKeyException
     */
    private static String sign(String signatureBaseString, String consumerSecret) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        Mac mac = Mac.getInstance("HmacSHA1");
        SecretKeySpec spec = new SecretKeySpec(new String(consumerSecret + "&").getBytes("UTF-8"), "HmacSHA1");
        mac.init(spec);
        byte text[] = signatureBaseString.getBytes("UTF-8");
        byte signatureBytes[] = mac.doFinal(text);
        signatureBytes = Base64.encodeBase64(signatureBytes);
        String signature = new String(signatureBytes, "UTF-8");
        return signature;
    }

    /**
     * request URL作成
     * @param requestParameters
     * @param signature
     * @return
     * @throws UnsupportedEncodingException
     */
    private static String makeRequestUrl(String requestUrl, SortedMap<String, SortedSet<String>> significantParameters, String signature) throws UnsupportedEncodingException {
        StringBuilder queryString = getRequestQueryString(significantParameters);
        queryString.append('&').append("oauth_signature").append("=").append(URLEncoder.encode(signature, "UTF-8"));
        return new StringBuffer(requestUrl).append("?").append(queryString.toString()).toString();
    }
}

class OAuthCodec2 extends URLCodec {

    private OAuthCodec2() {
    }

    public static String oauthEncode(String value) {
        if (value == null)
            return "";
        try {
            return new String(URLCodec.encodeUrl(SAFE_CHARACTERS, value.getBytes("UTF-8")), "US-ASCII");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    public static String oauthDecode(String value) throws DecoderException {
        if (value == null)
            return "";
        try {
            return new String(URLCodec.decodeUrl(value.getBytes("US-ASCII")), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    protected static final BitSet SAFE_CHARACTERS;

    static {
        SAFE_CHARACTERS = (BitSet)URLCodec.WWW_FORM_URL.clone();
        SAFE_CHARACTERS.clear(42);
        SAFE_CHARACTERS.clear(32);
        SAFE_CHARACTERS.set(126);
    }
}

mainメソッドを実行すると、認証URLが含まれた次のようなリクエストURLを確認できます。

https://api.ncloud.com/monitoring/?action=getMetricStatistics&endTime=2014-06-09T18%3A50%3A00%2B09%3A00&instanceNoList.1=68745&instanceNoList.2=68417&metricName=CPUUtilization&oauth_consumer_key=CCe2T0ilv4aO3kIevT3x&oauth_nonce=8844649875013849059&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1402484811&oauth_version=1.0&period=60&responseFormatType=xml&startTime=2014-06-09T17%3A50%3A00%2B09%3A00&oauth_signature=DUxxYjHIAtSIxd%2BA7TLYP0Wt3f0%3D

ユーザーはMy Page > API認証キー管理画面でAccess Key, Secret Keyの発行を受け、上の例題のconsumerKey, consumerSecretの値を該当の値に変更した後、テストしなければなりません。

モニタリングの場合、namespaceは /monitoring/,が使用されるので、ご参考ください。該当のURLをコピーしてブラウザにリクエストします。次のような結果を確認できます。

シナリオの実行

すべてのシナリオは認証のサンプルコード方式で説明されますが、mainメソッドのパラメータ部分についてのみ説明します。
自分が所有しているサーバのMetric統計情報を照会するためには、サーバのインスタンス番号が必ず必要であり、統計情報として提供可能なMetricにはどんなものがあるのかを確認しなければなりません。

サーバインスタンス番号の照会

サーバインスタンスリスト照会APIを利用して、Metric統計情報を取得したいサーバのインスタンス番号を確認します。

リクエストURLの作成

  1. アクション

    • getServerInstanceList
  2. アクションパラメータ

    • なし

      public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
       String requestMethod = "GET";
       String requestUrl = "https://api.ncloud.com";
       String serverNameSpace = "/server/";
      
       Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
       requestParameters.put("action", Arrays.asList("getServerInstanceList"));
       requestParameters.put("responseFormatType", Arrays.asList("xml"));
      
       SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
       String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + serverNameSpace, significantParameters);
       String signature = sign(signatureBaseString, consumerSecret);
       String requestFullUrl = makeRequestUrl(requestUrl + serverNameSpace, significantParameters, signature);
       System.out.println(requestFullUrl);
      }
      

結果

https://api.ncloud.com/server/?action=getServerInstanceList&approachKey=HkLxujk8TYdMs1gdCade&oauth_consumer_key=HkLxujk8TYdMs1gdCade&oauth_nonce=-8691634114796417401&oauth_signature_method=HMAC-

結果の実行

次のように照会された保有サーバの情報からインスタンス番号を確認できます。

統計情報として提供されるMetricの照会

統計情報として提供可能なMetric情報にはどんなものがあるのかを照会します。

リクエストURLの作成

  1. アクション

    • getListMetrics
  2. アクションパラメータ

    • instanceNo : 68417 (統計情報を照会したいインスタンス番号)
    public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
       String requestMethod = "GET";
       String requestUrl = "https://api.ncloud.com";
       String monitoringNameSpace = "/monitoring/";
    
       Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
       requestParameters.put("action", Arrays.asList("getListMetrics"));
       requestParameters.put("instanceNo", Arrays.asList("68417"));
       requestParameters.put("responseFormatType", Arrays.asList("xml"));
    
       SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
       String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + monitoringNameSpace, significantParameters);
       String signature = sign(signatureBaseString, consumerSecret);
       String requestFullUrl = makeRequestUrl(requestUrl + monitoringNameSpace, significantParameters, signature);
       System.out.println(requestFullUrl);
    }
    

結果

https://api.ncloud.com/monitoring/?action=getListMetrics&approachKey=HkLxujk8TYdMs1gdCade&instanceNo=68417&oauth_consumer_key=HkLxujk8TYdMs1gdCade&oauth_nonce=1683658783806074295&oauth_signature_method=HMAC-

結果の実行

次のようにインスタンス番号が68417であるサーバの場合、統計情報として取得可能な5種類のMetric情報(CPU使用量, Disk I/O, Network In/Out)があることを確認できます。

Metric統計の照会

先に照会した情報を利用して一定期間、特定周期のMetric統計情報を照会します。

サーバ作成リクエストURLの作成

  1. アクション

    • getMetricStatistics
  2. アクションパラメータ

    • instanceNoList.1 : 68417
    • metricName : CPUUtilization
    • startTime : 2014-06-09T17:50:00+09:00
    • endTime : 2014-06-09T18:50:00+09:00
    • period : 1800
    public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
       String requestMethod = "GET";
       String requestUrl = "https://api.ncloud.com";
       String monitoringNameSpace = "/monitoring/";
    
       Map<String, List<String>> requestParameters = new HashMap<String, List<String>>();
       requestParameters.put("action", Arrays.asList("getMetricStatistics"));
       requestParameters.put("instanceNoList.1", Arrays.asList("68417"));
       requestParameters.put("metricName", Arrays.asList("CPUUtilization"));
       requestParameters.put("startTime", Arrays.asList("2014-06-09T17:50:00+09:00"));
       requestParameters.put("endTime", Arrays.asList("2014-06-09T18:50:00+09:00"));
       requestParameters.put("period", Arrays.asList("1800"));
       requestParameters.put("responseFormatType", Arrays.asList("xml"));
    
       SortedMap<String, SortedSet<String>> significantParameters = getSignificateParametersForSiganturBaseString(requestParameters, consumerKey);
       String signatureBaseString = makeSignatureBaseString(requestMethod, requestUrl + monitoringNameSpace, significantParameters);
       String signature = sign(signatureBaseString, consumerSecret);
       String requestFullUrl = makeRequestUrl(requestUrl + monitoringNameSpace, significantParameters, signature);
       System.out.println(requestFullUrl);
    }
    

サーバ作成URLの作成結果

https://api.ncloud.com/monitoring/?action=getMetricStatistics&approachKey=HkLxujk8TYdMs1gdCade&endTime=2014-06-09T18%3A50%3A00%2B09%3A00&instanceNoList.1=68417&metricName=CPUUtilization&oauth_consumer_key=HkLxujk8TYdMs1gdCade&oauth_nonce=-8604354833602541619&oauth_signature_method=HMAC-

サーバ作成結果の実行

次のように一定期間、特定周期のMetric統計情報を照会できることを確認できます。

関連情報のご確認

次のガイドで関連情報を確認できます。

に対する検索結果は~件です。 ""

    に対する検索結果がありません。 ""

    処理中...