Dorong data metering dari instans layanan Compute Nest berbasis pay-as-you-go ke Alibaba Cloud Marketplace.
Deskripsi
Operasi ini hanya mendukung instans layanan Compute Nest berbasis pay-as-you-go. Metode pelaporan item yang dapat ditagih harus diatur ke Reported by Service Provider.
Panggil operasi ini dari dalam instans Elastic Compute Service (ECS) atau Container Service for Kubernetes (ACK) yang dibuat oleh Compute Nest. Untuk memanggil operasi ini menggunakan OpenAPI, lihat Call PushMeteringData by using OpenAPI.
Parameter permintaan
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
| Metering | String | Yes | Data metering, disediakan sebagai array JSON berisi catatan metering. Setiap catatan berisi bidang-bidang berikut: - StartTime: Waktu mulai periode metering. Satuan: detik (Stempel waktu UNIX). - EndTime: Waktu akhir periode metering. Satuan: detik (Stempel waktu UNIX). - Entities: Entitas metering, di mana setiap entitas berisi: - Key: Nama item yang dapat ditagih. Nilai yang valid: - Frequency: Jumlah kali instans digunakan.- Period: Durasi penggunaan instans. Satuan: detik. Satuan penagihan: jam. Rumus: detik ÷ 3.600 × harga per jam.- Storage: Ruang penyimpanan yang digunakan. Satuan: byte. Satuan penagihan: MB. Rumus: byte ÷ 1.024 ÷ 1.024 × harga per MB.- NetworkOut: Trafik upstream yang dikonsumsi. Satuan: bit. Satuan penagihan: Mbit. Rumus: bit ÷ 1.024 ÷ 1.024 × harga per Mbit.- NetworkIn: Trafik downstream yang dikonsumsi. Satuan: bit. Satuan penagihan: Mbit. Rumus: bit ÷ 1.024 ÷ 1.024 × harga per Mbit.- Character: Jumlah karakter.- DailyActiveUser: Jumlah pengguna aktif harian (DAU).- PeriodMin: Durasi penggunaan instans. Satuan: menit.- VirtualCpu: Jumlah core vCPU.- Memory: Ukuran memori. Satuan: GB.- Value: Nilai item yang dapat ditagih. Harus berupa bilangan bulat yang lebih besar dari atau sama dengan 0. Penting Saat tagihan dibuat, satuan metering dikonversi ke satuan penagihan. Jika hasilnya desimal, hanya dua tempat desimal pertama yang dipertahankan. Misalnya, jika Catatan
| [{"StartTime":"1664451045","EndTime":"1664451198","Entities":[{"Key":"Frequency","Value":"6"}]}] |
| Token | String | Yes | Token otentikasi yang digunakan oleh Compute Nest untuk memverifikasi bahwa data metering dikirimkan oleh penyedia layanan. Buat token dengan menerapkan enkripsi MD5 pada string Metering&Key, lalu mengonversi hasilnya menjadi string heksadesimal 32 karakter dalam huruf kecil.- Metering: Nilai parameter Metering. Lihat deskripsi parameter Metering di atas untuk formatnya.- Key: Kunci layanan yang diperoleh dari halaman produk layanan tersebut. Kunci layanan bersifat unik dan tidak berubah di berbagai versi layanan. Contoh: - String yang akan dienkripsi: Metering=[{"StartTime":"1664451045","EndTime":"1664451198","Entities":[{"Key":"Frequency","Value":"6"}]}]&Key=e98893f5ecc3ae1ctest- Token terenkripsi: 7aa81300b2aea77984b772495c8e4e83 | 7aa81300b2aea77984b772495c8e4e83 |
Parameter respons
| Name | Type | Description | Example | |
|---|---|---|---|---|
| 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 | Token yang digunakan oleh penyedia layanan untuk memverifikasi signature digital. Untuk informasi selengkapnya, lihat Digital signature verification in Compute Nest. | 50130a063c6acf833280d23169898bd4 |
Contoh
Contoh ini menunjukkan cara mendorong data metering dari instans ECS yang dibuat oleh produk Compute Nest berbasis pay-as-you-go di Alibaba Cloud Marketplace.
Contoh Curl
Dapatkan ID wilayah instans ECS.
Sebelum memanggil PushMeteringData, peroleh ID wilayah (
regionId) dari instans ECS tempat aplikasi Anda di-deploy. Nilai ini diperlukan untuk menyusun URL titik akhir pada langkah-langkah berikutnya.Jalankan perintah berikut untuk mengambil ID wilayah dari layanan metadata ECS:
curl http://100.100.100.200/latest/meta-data/region-idOutput contoh:
cn-hangzhou
Siapkan parameter permintaan.
"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 curl, string JSON memerlukan karakter escape
\. Pemanggilan berbasis kode tidak memerlukan karakter escape.Token: Terapkan enkripsi MD5 pada string
Metering=<metering_value>&Key=<service_key>untuk mendapatkan token huruf kecil 32 karakter7aa81300b2aea77984b772495c8e4e83.
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"}'CatatanGanti
cn-hangzhoudalam URL dengan ID wilayah aktual yang diperoleh pada Langkah 1.Output contoh:
{ "RequestId":"4ca591b5-bc30****-****-c4d0ec5d24ed", "Success":"true", "PushMeteringDataRequestId":"7lc658a2-tr41-****-****-c25es45vc248", "Token":"50130a063c6acf833280d23169898bd4" }
Contoh kode
Python
import requests
import json
import hashlib
import time
from urllib.request import urlopen
def get_region_id():
"""Dapatkan ID wilayah (misalnya cn-hangzhou) melalui layanan metadata Alibaba Cloud"""
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"Gagal mendapatkan ID wilayah: {str(e)}", file=sys.stderr)
sys.exit(1)
def push_metering_data(entities_map, service_key):
# Dapatkan waktu saat ini secara dinamis (stempel waktu Unix dalam detik)
current_time = int(time.time())
start_time = current_time
end_time = current_time + 1
# Bangun data Metering
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)
# Dapatkan ID wilayah secara dinamis dan bangun URL
region_id = get_region_id()
url = f"https://{region_id}.axt.aliyun.com/computeNest/marketplace/push_metering_data"
# Hitung Token
token_str = metering_str + "&" + service_key
token = hashlib.md5(token_str.encode()).hexdigest().lower()
# Kirim permintaan POST
try:
response = requests.post(
url,
json={
"Metering": metering_str,
"Token": token
},
headers={"Content-Type": "application/json"}
)
print(f"URL Permintaan: {url}")
print(f"Kode Status: {response.status_code}")
print(f"Tanggapan: {response.text}")
except Exception as e:
print(f"Permintaan Gagal: {str(e)}", file=sys.stderr)
if __name__ == "__main__":
import sys
# Parameter contoh (ganti dengan data dorong aktual, kunci adalah item metering, nilai adalah nilainya)
entities = {
"Frequency": "6"
}
# Kunci penyedia layanan
service_key = "your_service_key_here"
# Panggil fungsi
push_metering_data(entities, service_key)Contoh eksekusi:

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 {
// === Dapatkan ID wilayah secara dinamis === #
String regionId = getRegionId();
System.out.println("ID Wilayah Terdeteksi: " + regionId);
// === Bangun badan permintaan === #
Map<String, String> entities = new HashMap<>(); // Bangun Entities, ganti dengan konten dorong aktual
entities.put("Frequency", "6");
String serviceKey = "your_service_key_here"; // Ganti dengan Kunci penyedia layanan aktual
JSONObject payload = generateDynamicRequest(regionId, entities, serviceKey);
String paylodString = payload.toString();
// Jika hanya untuk pengujian, Anda dapat memberi komentar pada konten di atas dan langsung memasukkan konten berikut,
// di mana StartTime, EndTime, dan parameter lainnya perlu diganti
// String paylodString = "{\"Metering\":\"[{\\\"StartTime\\\":\\\"1664451045\\\",\\\"EndTime\\\":\\\"1664451198\\\",\\\"Entities\\\":[{\\\"Key\\\":\\\"Frequency\\\",\\\"Value\\\":\\\"6\\\"}]}]\",\"Token\":\"7aa81300b2aea77984b772495c8e4e83\"}";
// === Kirim permintaan POST === #
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);
}
// === Baca tanggapan === #
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("Tanggapan: " + response.toString());
System.out.println("URL Permintaan: " + urlStr);
} catch (Exception e) {
e.printStackTrace();
}
}
// === Dapatkan ID wilayah secara dinamis (layanan metadata Alibaba Cloud) ===
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); // timeout 2 detik
conn.setReadTimeout(2000);
try (BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()))) {
return in.readLine().trim();
}
}
// === Hasilkan data permintaan secara dinamis ===
private static JSONObject generateDynamicRequest(String regionId, Map<String, String> entities, String serviceKey) throws Exception {
// Dapatkan stempel waktu saat ini
long currentTime = System.currentTimeMillis() / 1000;
long startTime = currentTime;
long endTime = currentTime + 1;
// Bangun data Metering
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);
// Hitung Token
String meteringStr = meteringArray.toString();
String tokenStr = meteringStr + "&" + serviceKey;
String token = md5(tokenStr);
// Bangun badan permintaan lengkap
JSONObject payload = new JSONObject();
payload.put("Metering", meteringStr);
payload.put("Token", token);
return payload;
}
// === Metode enkripsi MD5 ===
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:

Pastikan proyek Anda menyertakan pustaka org.json. Untuk proyek Maven, tambahkan dependensi berikut:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230618</version>
</dependency>Kode error
| Error code | Error message | Description |
|---|---|---|
| OperationDenied | The serviceInstance does not supported push metering data. | Instans layanan bukan berbasis pay-as-you-go dan tidak mendukung pendorongan data metering. |
| OperationDenied | Only metering entities classified as Custom and associated with a service can be pushed. The entity ${EntityId} is invalid. | Item yang dapat ditagih tidak mendukung pendorongan. Metode pelaporan harus diatur ke Reported by Service Provider dan item yang dapat ditagih harus terikat pada layanan. |
| MissingParameter.${parametersName} | The input parameter "${parametersName}" that is mandatory for processing this request is not supplied. | Parameter yang diperlukan tidak ditentukan. |
| 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. Instans ECS mungkin tidak dibuat oleh Compute Nest. |