LindormTSDB, HTTP POST üzerinden standart SQL deyimlerini kabul eden HTTP tabanlı bir SQL API sunar. Bu API'yi kullanarak veritabanları ve zaman serisi tabloları oluşturabilir, veri yazabilir ve istemci kitaplığı yüklemeden herhangi bir Java dışı uygulamadan sorgu çalıştırabilirsiniz.
Java uygulamaları için bunun yerine JDBC sürücüsünü kullanın. Tek düğümlü Lindorm örnekleri HTTP tabanlı SQL API'sini desteklemez.
Nasıl çalışır
Tüm istekler HTTP POST kullanarak tek bir uç noktaya gider. SQL deyimi istek gövdesinde yer alır. API JSON yanıtı döndürür.
POST /api/v2/sql (port 8242)
SELECT dahil tüm deyim türleri için POST yöntemi gereklidir.
Kimlik doğrulama etkinleştirilmişse Basic Authentication üstbilgisi ekleyin. İsteğe bağlı olarak, hedef veritabanını ayarlamak veya büyük sonuç kümelerini parçalar halinde akışa almak için sorgu parametreleri iletebilirsiniz.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Bir LindormTSDB örnek uç noktası (biçim:
ld-<instance-id>-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242)Uç noktada
8242bağlantı noktasına ağ erişimi(Kimlik doğrulama etkinleştirilmişse) Geçerli bir kullanıcı adı ve parola
İstek gönderme
Uç nokta
| Yol | Yöntem | Açıklama |
|---|---|---|
/api/v2/sql |
POST | Bir SQL deyimi yürütür |
İstek biçimi
SQL deyimini istek gövdesine dahil edin. İstek üstbilgisinde Content-Type: text/plain değerini ayarlayın.
SQL deyimlerini noktalı virgülle (;) sonlandırmayın. LindormTSDB dahili olarak SQL-92 deyim sonlandırıcıları olarak noktalı virgülleri desteklese de isteğin gövdesine noktalı virgül eklemek hataya neden olur.
Sorgu parametreleri
| Parametre | Açıklama | Varsayılan |
|---|---|---|
database |
SQL deyiminin çalıştırılacağı veritabanı. Deyim bir veritabanı belirtmezse LindormTSDB bu veritabanında arama yapar. | default |
chunked |
Sonuç kümesini birden çok JSON bloğu halinde akışa almak için true olarak ayarlayın. Tüm sonuç kümesinin bellekte arabelleklenmesini önlemek amacıyla çok sayıda satır döndüren sorgular için bu seçeneği kullanın. |
false |
chunk_size |
JSON bloğu başına maksimum satır sayısı. Yalnızca chunked=true olduğunda etkili olur. |
1000 |
Kimlik doğrulama
Kullanıcı kimlik doğrulaması etkinleştirilmişse Basic Authentication kullanarak bir Authorization üstbilgisi ekleyin:
Authorization: Basic <Base64-encoded credentials>
Base64 kodlu kimlik bilgileri, iki nokta üst üste işaretiyle birleştirilen kullanıcı adı ve paroladan oluşur: username:password.
Örneğin, varsayılan kimlik bilgileri (root:root) şu şekilde kodlanır:
Authorization: Basic cm9vdDpyb290
Dile özel kodlama için programlama dilinizin Base64 kitaplığı belgelerine bakın.
Örnekler
Aşağıdaki örnekler curl kullanır ve tam iş akışını kapsar: veritabanı oluşturma, zaman serisi tablosu oluşturma, veri ekleme ve veri sorgulama.
İstek gövdesindeki SQL deyimlerini noktalı virgülle (;) sonlandırmayın. Bu durum istek hatasına neden olur.
Veritabanı oluşturma
curl -i -X POST \
http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql \
-d 'CREATE DATABASE DB1'
Başarılı bir yanıt HTTP 200 döndürür.
Zaman serisi tablosu oluşturma
Hedef veritabanını sorgu parametresi olarak iletebilir veya tablo adını veritabanı adı ile niteleyebilirsiniz. Aşağıdaki iki deyim de aynı tabloyu oluşturur:
# Using the database query parameter
curl -i -X POST \
"http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql?database=DB1" \
-d 'CREATE TABLE SENSOR (device_id VARCHAR TAG, region VARCHAR TAG, time TIMESTAMP, temperature DOUBLE, humidity DOUBLE)'
# Using a fully qualified table name
curl -i -X POST \
http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql \
-d 'CREATE TABLE DB1.SENSOR (device_id VARCHAR TAG, region VARCHAR TAG, time TIMESTAMP, temperature DOUBLE, humidity DOUBLE)'
Kimlik doğrulama ile veri sorgulama
Kimlik bilgilerini iletmek için -u username:password kullanın. Kullanıcının tablo üzerinde gerekli izinlere sahip olduğundan emin olun.
curl -i -X POST \
-u tsdbuser:password \
"http://ld-xxxxxxxxx-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql?database=DB1" \
-d 'SELECT device_id, region, time, MAX(temperature) as max_t FROM SENSOR WHERE time >= 1619076780000 AND time <= 1619076800000 SAMPLE BY 20s'
Başarılı bir yanıt, sonuç kümesiyle birlikte HTTP 200 döndürür:
HTTP/1.1 200 OK
Content-Type: application/json
{
"columns": ["device_id", "region", "time", "max_t"],
"metadata": ["VARCHAR", "VARCHAR", "TIMESTAMP", "DOUBLE"],
"rows": [
["<device_id_value>", "<region_value>", "<timestamp_value>", <numeric_value>],
...
]
}
Geçersiz bir SQL deyimi, hata gövdesiyle birlikte HTTP 400 döndürür:
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"code": <error_code>,
"sqlstate": "<sql_state_code>",
"message": "<error_message>"
}
Hata kodlarının tam listesi için bkz. Yaygın hata kodları.
Yanıt parametreleri
Başarılı yanıt (HTTP 200)
| Parametre | Tür | Açıklama |
|---|---|---|
columns |
Dize dizisi | Sonuç kümesindeki sütun adları |
metadata |
Dize dizisi | Her sütunun veri türleri. Desteklenen türler için bkz. Veri türleri. |
rows |
Dizi dizisi | Her iç dizi, columns değerlerine karşılık gelen değerlerle bir satırı temsil eder |
Hata yanıtı (HTTP 400)
| Parametre | Tür | Açıklama |
|---|---|---|
code |
int | Hata kodu |
sqlstate |
String | SQL durum kodu |
message |
String | Hata mesajı |
Python örneği
Aşağıdaki örnekte requests kitaplığı kullanılarak bir tablo oluşturulur, satırlar eklenir ve bir sorgu çalıştırılır.
Zaman serisi tablosu oluşturma
import requests
endpoint = "http://ld-bp1s0vbu8955w****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242/api/v2/sql"
sql = """CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
)"""
r = requests.post(endpoint, sql)
print(r.status_code, r.content)
Veri ekleme
sql = """INSERT INTO sensor (device_id, region, time, temperature, humidity) VALUES
('F07A1260', 'north-cn', '2021-04-22 15:33:00', 12.1, 45),
('F07A1260', 'north-cn', '2021-04-22 15:33:10', 13.2, 47),
('F07A1260', 'north-cn', '2021-04-22 15:33:20', 10.6, 46),
('F07A1261', 'south-cn', '2021-04-22 15:33:00', 18.1, 44),
('F07A1261', 'south-cn', '2021-04-22 15:33:10', 19.7, 44)"""
r = requests.post(endpoint, sql)
print(r.status_code, r.content)
Veri sorgulama
r = requests.post(endpoint, "SELECT * FROM sensor")
print(r.status_code, r.content)