Dorong data metering dari dalam instans layanan.
Catatan penggunaan
-
Operasi ini hanya mendorong data metering untuk instans layanan Compute Nest berbayar sesuai penggunaan. Metode pelaporan untuk item yang dapat ditagih harus diatur ke Reported by Service Provider.
-
Untuk instans ECS atau ACK yang dibuat oleh layanan Compute Nest, Anda dapat memanggil operasi ini langsung dari dalam instans untuk mendorong data metering. Untuk memanggil operasi ini menggunakan OpenAPI, lihat Panggil PushMeteringData menggunakan OpenAPI.
Parameter permintaan
|
Parameter |
Tipe |
Wajib |
Deskripsi |
Contoh |
|
Metering |
String |
Ya |
Data metering dalam bentuk string JSON. Parameter berikut disertakan:
Catatan
|
|
|
Token |
String |
Ya |
Token yang digunakan oleh Compute Nest untuk memverifikasi bahwa permintaan berasal dari penyedia layanan yang sah. Token ini merupakan Hash MD5 32 karakter dalam huruf kecil dari sebuah string. String tersebut dibentuk dengan menggabungkan string JSON
|
|
Parameter respons
|
Parameter |
Tipe |
Deskripsi |
Contoh |
||
|
RequestId |
String |
ID permintaan yang dikembalikan oleh Compute Nest. |
e6862d3a-9305-4289-8dd3-9c52a680228b |
||
|
Success |
Boolean |
Menunjukkan apakah permintaan berhasil. |
true |
||
|
PushMeteringDataRequestId |
String |
ID permintaan yang dikembalikan oleh Alibaba Cloud Marketplace. |
7lc658a2-tr41---c25es45vc248 |
||
|
Token |
String |
Tanda tangan digital yang dikembalikan. Anda dapat menggunakan token ini untuk memverifikasi respons. Untuk informasi lebih lanjut, lihat Verifikasi tanda tangan digital dari Compute Nest. |
50130a063c6acf833280d23169898bd4 |
Contoh
Contoh ini menunjukkan cara memanggil operasi dari instans ECS yang dibuat oleh layanan Compute Nest berbayar sesuai penggunaan dari Alibaba Cloud Marketplace.
Contoh curl
-
Peroleh ID wilayah instans ECS
Sebelum memanggil operasi ini, peroleh ID wilayah instans ECS tempat aplikasi Anda dideploy. Anda akan memerlukan ID ini pada langkah berikutnya.
-
Jalankan perintah berikut untuk menanyakan ID wilayah dari layanan metadata instans:
curl http://100.100.100.200/latest/meta-data/region-id -
Respons contoh:
cn-hangzhou
-
-
Siapkan parameter
"Metering":"[{\"StartTime\":\"1664451045\",\"EndTime\":\"1664451198\",\"Entities\":[{\"Key\":\"Frequency\",\"Value\":\"6\"}]}]","Token":"7aa81300b2aea77984b772495c8e4e83"-
Metering:[{\"StartTime\":\"1664451045\",\"EndTime\":\"1664451198\",\"Entities\":[{\"Key\":\"Frequency\",\"Value\":\"6\"}]}]CatatanKarena contoh ini menggunakan perintah curl, string JSON untuk parameter
Meteringharus di-escape dengan karakter\. Jika Anda memanggil operasi dari kode Anda, Anda tidak perlu melakukan escape string tersebut. -
Token: Hasilkan token dengan membuat hash MD5 32 karakter huruf kecil dari string yang menggabungkan string JSONMeteringyang telah di-stringify, tanda ampersand (&), dan kunci layanan Anda. Token dalam contoh ini adalah7aa81300b2aea77984b772495c8e4e83.
-
-
Kirim permintaan
curl -H "Content-Type: application/json" -XPOST https://cn-hangzhou.axt.aliyun.com/computeNest/marketplace/push_metering_data -d '{"Metering":"[{\"StartTime\":\"1664451045\",\"EndTime\":\"1664451198\",\"Entities\":[{\"Key\":\"Frequency\",\"Value\":\"6\"}]}]","Token":"7aa81300b2aea77984b772495c8e4e83"}'CatatanDalam
https://cn-hangzhou.axt.aliyun.com,cn-hangzhouadalah wilayah yang Anda peroleh di Langkah 1. Saat melakukan panggilan, ganti informasi wilayah dengan wilayah aktual Anda. -
Lihat respons
{ "RequestId":"4ca591b5-bc30-****-****-c4d0ec5d24ed", "Success":"true", "PushMeteringDataRequestId":"7lc658a2-tr41-****-****-c25es45vc248", "Token":"50130a063c6acf833280d23169898bd4" }
Contoh kode
Python
import requests
import json
import hashlib
import time
import sys
from urllib.request import urlopen
def get_region_id():
"""Gets the region ID from the Alibaba Cloud instance metadata service."""
try:
with urlopen(
"http://100.100.100.200/latest/meta-data/region-id",
timeout=2
) as response:
return response.read().decode().strip()
except Exception as e:
print(f"Failed to get region ID: {str(e)}", file=sys.stderr)
sys.exit(1)
def push_metering_data(entities_map, service_key):
# Get the current time as a UNIX timestamp in seconds.
current_time = int(time.time())
start_time = current_time
end_time = current_time + 1
# Construct the Metering data.
metering_data = [
{
"StartTime": str(start_time),
"EndTime": str(end_time),
"Entities": [
{"Key": key, "Value": str(value)}
for key, value in entities_map.items()
]
}
]
metering_str = json.dumps(metering_data)
# Get the region ID and construct the request URL.
region_id = get_region_id()
url = f"https://{region_id}.axt.aliyun.com/computeNest/marketplace/push_metering_data"
# Calculate the token.
token_str = metering_str + "&" + service_key
token = hashlib.md5(token_str.encode()).hexdigest().lower()
# Send the POST request.
try:
response = requests.post(
url,
json={
"Metering": metering_str,
"Token": token
},
headers={"Content-Type": "application/json"}
)
print(f"Request URL: {url}")
print(f"Status Code: {response.status_code}")
print(f"Response: {response.text}")
except Exception as e:
print(f"Request Failed: {str(e)}", file=sys.stderr)
if __name__ == "__main__":
# Sample parameters. Replace the key with your billable item and the value with the metered quantity.
entities = {
"Frequency": "6"
}
# Your service key.
service_key = "your_service_key_here"
# Call the function.
push_metering_data(entities, service_key)
Contoh eksekusi:
[root@xxx aZ ~]# vim push.py
[root@xxx aZ ~]# python3 push.py
Request URL: https://cn-hangzhou.axt.aliyun.com/computeNest/marketplace/push_metering_data
Status Code: 200
Response: {"code":200,"requestId":"5979658a-7d11-4c61-xxx","instanceId":"i-bp140hj xxx","result":{"RequestId":"B3588CBD-6C3F-51C7-xxx","PushMeteringDataRequestId":"88D8CADB-2417-5417-504-xxx","Token":"xxx"},"Success":true}
Java
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
public class MeteringPusher {
public static void main(String[] args) {
try {
// Get the region ID dynamically.
String regionId = getRegionId();
System.out.println("Detected Region ID: " + regionId);
// Construct the request body.
Map<String, String> entities = new HashMap<>(); // Construct the Entities. Replace with your actual data.
entities.put("Frequency", "6");
String serviceKey = "your_service_key_here"; // Replace with your actual service key.
JSONObject payload = generateDynamicRequest(regionId, entities, serviceKey);
String paylodString = payload.toString();
// For testing purposes, you can comment out the dynamic generation and use a static payload string. Remember to replace the parameters.
// String paylodString = "{\"Metering\":\"[{\\\"StartTime\\\":\\\"1664451045\\\",\\\"EndTime\\\":\\\"1664451198\\\",\\\"Entities\\\":[{\\\"Key\\\":\\\"Frequency\\\",\\\"Value\\\":\\\"6\\\"}]}]\",\"Token\":\"7aa81300b2aea77984b772495c8e4e83\"}";
// Send the POST request.
String urlStr = "https://" + regionId + ".axt.aliyun.com/computeNest/marketplace/push_metering_data";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
byte[] input = paylodString.getBytes("UTF-8");
os.write(input, 0, input.length);
}
// Read the response.
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine);
}
conn.disconnect();
System.out.println("Response: " + response.toString());
System.out.println("Request URL: " + urlStr);
} catch (Exception e) {
e.printStackTrace();
}
}
// Get the region ID from the Alibaba Cloud instance metadata service.
private static String getRegionId() throws Exception {
String regionIdUrl = "http://100.100.100.200/latest/meta-data/region-id";
HttpURLConnection conn = (HttpURLConnection) new URL(regionIdUrl).openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(2000); // 2-second timeout
conn.setReadTimeout(2000);
try (BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()))) {
return in.readLine().trim();
}
}
// Generate the request data dynamically.
private static JSONObject generateDynamicRequest(String regionId, Map<String, String> entities, String serviceKey) throws Exception {
// Get the current timestamp.
long currentTime = System.currentTimeMillis() / 1000;
long startTime = currentTime;
long endTime = currentTime + 1;
// Construct the Metering data.
JSONArray meteringArray = new JSONArray();
JSONObject meteringItem = new JSONObject();
meteringItem.put("StartTime", String.valueOf(startTime));
meteringItem.put("EndTime", String.valueOf(endTime));
JSONArray entitiesArray = new JSONArray();
for (Map.Entry<String, String> entry : entities.entrySet()) {
entitiesArray.put(new JSONObject()
.put("Key", entry.getKey())
.put("Value", entry.getValue()));
}
meteringItem.put("Entities", entitiesArray);
meteringArray.put(meteringItem);
// Calculate the token.
String meteringStr = meteringArray.toString();
String tokenStr = meteringStr + "&" + serviceKey;
String token = md5(tokenStr);
// Construct the complete request payload.
JSONObject payload = new JSONObject();
payload.put("Metering", meteringStr);
payload.put("Token", token);
return payload;
}
// Computes the MD5 hash of a string.
private static String md5(String input) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
}
Contoh eksekusi:
[root@xxx ~]# javac MeteringPusher.java
[root@xxx ~]# java MeteringPusher
Detected Region ID: cn-hangzhou
Response: {"code":200,"requestId":"20a00ad2-bb10-4abxxx","instanceId":"i-bp140hjfmsqcuqanv6ea","result":{"RequestId":"3FF6B8A8-F72F-5Bxxx","PushMeteringDataRequestId":"E2E_862fc9bfd36fe02bf7b7380ed437ba7","Success":true}}
Request URL: https://cn-hangzhou.axt.aliyun.com/computeNest/marketplace/push_metering_data
Pastikan proyek Anda menyertakan library org.json. Sebagai contoh, jika Anda menggunakan Maven, tambahkan dependensi berikut:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230618</version>
</dependency>
Kode error
|
Kode Error |
Pesan Error |
Deskripsi |
|
OperationDenied |
The service instance does not support pushing metering data. |
Pushing metering data tidak didukung karena instans layanan bukan instans berbayar sesuai penggunaan. |
|
Only metering entities classified as Custom and associated with a service can be pushed. The entity ${EntityId} is invalid. |
Item yang dapat ditagih yang ditentukan tidak mendukung pendorongan data. Pastikan metode pelaporannya diatur ke Reported by Service Provider dan telah dikaitkan dengan layanan secara benar. |
|
|
MissingParameter.${parametersName} |
The required parameter "${parametersName}" is missing. |
Parameter yang diperlukan tidak tersedia. |
|
InvalidParameter.${parametersName} |
The provided parameter "${parametersName}" is invalid. |
Parameter yang ditentukan tidak valid. |
|
EntityNotExist.ServiceInstance |
The specified service instance cannot be found. |
Instans layanan tidak ada. Hal ini dapat terjadi jika instans tidak dibuat oleh Compute Nest. |