Ao usar o modelo TimeSeries por meio dos SDKs do Tablestore, você precisa criar uma tabela de séries temporais, gravar dados de séries temporais nessa tabela e, em seguida, recuperar séries temporais e consultar dados de séries temporais.
Pré-requisitos
Crie uma instância para o modelo TimeSeries. Para mais informações, consulte Create an instance for the TimeSeries model.
Inicialize um cliente do Tablestore. Para mais informações, consulte Initialize a Tablestore client.
Notas de uso
O modelo TimeSeries é compatível com as seguintes regiões: China (Hangzhou), China (Shanghai), China (Beijing), China (Zhangjiakou), China (Ulanqab), China (Shenzhen), China (Chengdu), China (Hong Kong), Japan (Tokyo), Malaysia (Kuala Lumpur), Germany (Frankfurt), Indonesia (Jakarta), UK (London), US (Silicon Valley), US (Virginia), SAU (Riyadh - Partner Region), e Singapore.
Uso dos SDKs do Tablestore
Use os seguintes SDKs do Tablestore para começar a usar o modelo TimeSeries. Este tópico utiliza o Tablestore SDK for Java como exemplo.
Etapa 1: Criar uma tabela de séries temporais
Chame a operação CreateTimeseriesTable para criar uma tabela de séries temporais e armazenar dados.
Para armazenar dados de séries temporais com baixo custo e consultá-los e analisá-los rapidamente, crie um armazenamento analítico para a tabela de séries temporais. O recurso de armazenamento analítico serve para armazenar e analisar dados de séries temporais a longo prazo. Para mais informações, consulte Analytical store for time series.
O código de exemplo a seguir mostra como criar uma tabela de séries temporais chamada test_timeseries_table, na qual os dados nunca expiram:
private static void createTimeseriesTable(TimeseriesClient client) {
String tableName = "test_timeseries_table";
TimeseriesTableMeta timeseriesTableMeta = new TimeseriesTableMeta(tableName);
int timeToLive = -1;
timeseriesTableMeta.setTimeseriesTableOptions(new TimeseriesTableOptions(timeToLive));
CreateTimeseriesTableRequest request = new CreateTimeseriesTableRequest(timeseriesTableMeta);
// Specify that the default analytical store is not created.
request.setEnableAnalyticalStore(false);
client.createTimeseriesTable(request);
}
Etapa 2: Gravar dados de séries temporais
Após criar a tabela de séries temporais, chame a operação PutTimeseriesData para gravar vários registros de dados na tabela simultaneamente.
O código de exemplo a seguir mostra como gravar várias linhas de dados em uma tabela de séries temporais chamada test_timeseries_table:
private static void putTimeseriesData(TimeseriesClient client) {
List<TimeseriesRow> rows = new ArrayList<TimeseriesRow>();
for (int i = 0; i < 10; i++) {
Map<String, String> tags = new HashMap<String, String>();
tags.put("region", "hangzhou");
tags.put("os", "Ubuntu16.04");
// Specify the measurement name, data source, and tags of a time series to construct the identifiers of the time series.
TimeseriesKey timeseriesKey = new TimeseriesKey("cpu", "host_" + i, tags);
// Specify the timeseriesKey and timeInUs parameters to create a row of time series data.
TimeseriesRow row = new TimeseriesRow(timeseriesKey, System.currentTimeMillis() * 1000 + i);
// Add data values.
row.addField("cpu_usage", ColumnValue.fromDouble(10.0));
row.addField("cpu_sys", ColumnValue.fromDouble(5.0));
rows.add(row);
}
String tableName = "test_timeseries_table";
PutTimeseriesDataRequest putTimeseriesDataRequest = new PutTimeseriesDataRequest(tableName);
putTimeseriesDataRequest.setRows(rows);
// Write multiple rows of time series data at the same time.
PutTimeseriesDataResponse putTimeseriesDataResponse = client.putTimeseriesData(putTimeseriesDataRequest);
// Check whether all data is written to the time series table.
if (!putTimeseriesDataResponse.isAllSuccess()) {
for (PutTimeseriesDataResponse.FailedRowResult failedRowResult : putTimeseriesDataResponse.getFailedRows()) {
System.out.println(failedRowResult.getIndex());
System.out.println(failedRowResult.getError());
}
}
}
Etapa 3: Recuperar séries temporais
Se você não tiver certeza das informações da série temporal a ser consultada, como o nome da métrica e a origem dos dados, chame a operação QueryTimeseriesMeta e especifique condições para recuperar as séries temporais que atendem aos critérios definidos.
O código de exemplo a seguir mostra como consultar todas as séries temporais cujo nome da métrica é cpu e que têm a tag os com valor prefixado por Ubuntu em uma tabela de séries temporais.
private static void queryTimeseriesMeta(TimeseriesClient client) {
// Specify the name of the time series table.
String tableName = "<TIME_SERIES_TABLE>";
QueryTimeseriesMetaRequest queryTimeseriesMetaRequest = new QueryTimeseriesMetaRequest(tableName);
// Query all time series whose metric name is cpu and that have the os tag whose value is prefixed with Ubuntu. measurement_name="cpu" and have_prefix(os, "Ubuntu")
CompositeMetaQueryCondition compositeMetaQueryCondition = new CompositeMetaQueryCondition(MetaQueryCompositeOperator.OP_AND);
compositeMetaQueryCondition.addSubCondition(new MeasurementMetaQueryCondition(MetaQuerySingleOperator.OP_EQUAL, "cpu"));
compositeMetaQueryCondition.addSubCondition(new TagMetaQueryCondition(MetaQuerySingleOperator.OP_PREFIX, "os", "Ubuntu"));
queryTimeseriesMetaRequest.setCondition(compositeMetaQueryCondition);
queryTimeseriesMetaRequest.setGetTotalHits(true);
// Specify the maximum number of time series metadata entries that can be returned for a single request.
queryTimeseriesMetaRequest.setLimit(100);
// Initiate the query.
QueryTimeseriesMetaResponse queryTimeseriesMetaResponse = client.queryTimeseriesMeta(queryTimeseriesMetaRequest);
// Display the total number of time series that meet the query conditions.
System.out.println(queryTimeseriesMetaResponse.getTotalHits());
// Save the request results.
List<TimeseriesMeta> timeseriesMetas = new ArrayList<TimeseriesMeta>();
timeseriesMetas.addAll(queryTimeseriesMetaResponse.getTimeseriesMetas());
// If NextToken is included in the response, you can initiate a new request to obtain the remaining results.
while (queryTimeseriesMetaResponse.getNextToken() != null) {
queryTimeseriesMetaRequest.setNextToken(queryTimeseriesMetaResponse.getNextToken());
queryTimeseriesMetaResponse = client.queryTimeseriesMeta(queryTimeseriesMetaRequest);
timeseriesMetas.addAll(queryTimeseriesMetaResponse.getTimeseriesMetas());
// Specify the maximum number of time series that can be returned.
if (timeseriesMetas.size() >= 1000) {
break;
}
}
System.out.println(timeseriesMetas.size());
for (TimeseriesMeta timeseriesMeta : timeseriesMetas) {
System.out.println(timeseriesMeta.getTimeseriesKey().getMeasurementName());
System.out.println(timeseriesMeta.getTimeseriesKey().getDataSource());
System.out.println(timeseriesMeta.getTimeseriesKey().getTags());
System.out.println(timeseriesMeta.getAttributes());
System.out.println(timeseriesMeta.getUpdateTimeInUs());
}
}
Etapa 4: Consultar dados de séries temporais
Chame a operação GetTimeseriesData para consultar os dados de séries temporais que atendem às condições definidas em uma série temporal.
O código de exemplo a seguir mostra como consultar os dados de séries temporais que atendem às condições definidas em uma tabela de séries temporais:
private static void getTimeseriesData(TimeseriesClient client) {
String tableName = "<TIMESERIES_TABLE_NAME>";
GetTimeseriesDataRequest getTimeseriesDataRequest = new GetTimeseriesDataRequest(tableName);
Map<String, String> tags = new HashMap<String, String>();
tags.put("region", "hangzhou");
tags.put("os", "Ubuntu16.04");
// Specify the measurement name, data source, and tags of a time series to construct the identifiers of the time series.
TimeseriesKey timeseriesKey = new TimeseriesKey("cpu", "host_0", tags);
getTimeseriesDataRequest.setTimeseriesKey(timeseriesKey);
// Specify the time range.
getTimeseriesDataRequest.setTimeRange(0, (System.currentTimeMillis() + 60 * 1000) * 1000);
// Specify the maximum number of rows that you want to return.
getTimeseriesDataRequest.setLimit(10);
// Optional. Specify whether to sort the query results in reverse chronological order. Default value: false. If you set this parameter to true, the query results are sorted in reverse chronological order.
getTimeseriesDataRequest.setBackward(false);
// Optional. Specify the columns that you want to return. If you do not specify this parameter, all columns are returned.
getTimeseriesDataRequest.addFieldToGet("string_1", ColumnType.STRING);
getTimeseriesDataRequest.addFieldToGet("long_1", ColumnType.INTEGER);
GetTimeseriesDataResponse getTimeseriesDataResponse = client.getTimeseriesData(getTimeseriesDataRequest);
System.out.println(getTimeseriesDataResponse.getRows().size());
// If the nextToken parameter is not empty, you can initiate another request to obtain the remaining rows.
if (getTimeseriesDataResponse.getNextToken() != null) {
// Query the nextToken value.
byte[] nextToken = getTimeseriesDataResponse.getNextToken();
// If you want to persist nextToken or transfer nextToken to the frontend page, you can use Base64 to encode nextToken into a string.
{
// Tokens are not strings. If you use new String(nextToken) to encode a token into a string, information about the token is lost.
String tokenAsString = Base64.toBase64String(nextToken);
// Decode the string into bytes.
byte[] tokenAsByte = Base64.fromBase64String(tokenAsString);
}
getTimeseriesDataRequest.setNextToken(nextToken);
getTimeseriesDataResponse = client.getTimeseriesData(getTimeseriesDataRequest);
System.out.println(getTimeseriesDataResponse.getRows().size());
}
}
Perguntas frequentes
Referências
Você também pode começar a usar o modelo TimeSeries por meio do console do Tablestore ou do Tablestore CLI. Para mais informações, consulte Use the TimeSeries model in the Tablestore console e Use the TimeSeries model in the Tablestore CLI.