Interroge les points de données d'une ou plusieurs séries temporelles sur une plage de temps spécifiée. Envoyez une requête POST vers /api/query avec un corps JSON qui définit la plage de temps et une ou plusieurs sous-requêtes.
Syntaxe de la requête
POST /api/query
Paramètres de la requête
| Paramètre | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
start |
Long | Oui | — | Le début de la plage de temps. Unité : secondes ou millisecondes. TSDB détermine l'unité en fonction de la valeur numérique. Consultez Unités d'horodatage. |
end |
Long | Non | Heure actuelle du serveur | La fin de la plage de temps. Unité : secondes ou millisecondes. Par défaut, il s'agit de l'heure actuelle sur le serveur TSDB. Consultez Unités d'horodatage. |
queries |
Array | Oui | — | Un tableau de sous-requêtes. Consultez Paramètres de sous-requête. |
msResolution |
Boolean | Non | false |
Indique s'il faut renvoyer les horodatages en millisecondes. S'applique uniquement lorsque les points de données interrogés utilisent des horodatages à la précision de la seconde. Si true, tous les horodatages de la réponse sont convertis en millisecondes. Si false, l'unité d'origine est conservée. Les points de données stockés avec des horodatages en millisecondes sont toujours renvoyés en millisecondes, quel que soit ce paramètre. |
hint |
Map | Non | — | Une indication de requête pour réduire le temps de réponse. Consultez Paramètre : hint. |
Unités d'horodatage
TSDB détermine l'unité d'horodatage à partir de la valeur numérique :
| Plage | Unité | Plage de dates |
|---|---|---|
[4294968, 4294967295] |
Secondes | 1970-02-20 01:02:48 – 2106-02-07 14:28:15 |
[4294967296, 9999999999999] |
Millisecondes | 1970-02-20 01:02:47.296 – 2286-11-21 01:46:39.999 |
(-∞, 4294968) ou (9999999999999, +∞) |
Invalide | — |
Ces règles s'appliquent à la fois à/api/put(écriture) et/api/query(requête).
Pour interroger les points de données à un instant précis, définissez start et end sur la même valeur, par exemple 1356998400.
Paramètres de sous-requête
Chaque objet du tableau queries prend en charge les paramètres suivants :
| Paramètre | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
aggregator |
String | Oui | — | La fonction d'agrégation. Consultez Paramètre : aggregator. Exemple : sum. |
metric |
String | Oui | — | Le nom de la métrique. Exemple : sys.cpu0. |
rate |
Boolean | Non | false |
Indique s'il faut calculer le taux de croissance entre les valeurs consécutives. Formule : (Vt − Vt-1) / (t − t-1). |
delta |
Boolean | Non | false |
Indique s'il faut calculer la différence entre les valeurs consécutives. Formule : Vt − Vt-1. Consultez Paramètre : delta. |
limit |
Integer | Non | 0 |
Le nombre maximal de points de données à renvoyer par série temporelle et par page. 0 signifie qu'il n'y a aucune limite. |
offset |
Integer | Non | 0 |
Le nombre de points de données à ignorer par série temporelle et par page. 0 signifie qu'aucun point de données n'est ignoré. |
dpValue |
String | Non | — | Filtre les points de données renvoyés par valeur. Opérateurs pris en charge : >, <, =, <=, >=, !=. Si la valeur est une chaîne, seuls = et != sont pris en charge. Appliqué après l'agrégation. |
preDpValue |
String | Non | — | Filtre les points de données bruts lors de l'analyse avant l'agrégation. Mêmes opérateurs que pour dpValue. Les points de données qui ne passent pas ce filtre sont exclus de tous les calculs. |
downsample |
String | Non | — | La configuration de sous-échantillonnage. Consultez Paramètre : downsample. Exemple : 60m-avg. |
tags |
Map | Non | — | Conditions de filtrage basées sur les tags. Mutuellement exclusif avec filters. Si les deux sont spécifiés, celui qui apparaît en dernier dans le JSON prend effet. |
filters |
List | Non | — | Conditions de filtrage au format JSON. Mutuellement exclusif avec tags. Si les deux sont spécifiés, celui qui apparaît en dernier dans le JSON prend effet. Consultez Paramètre : filters. |
hint |
Map | Non | — | Une indication de requête au niveau de la sous-requête. Consultez Paramètre : hint. |
forecasting |
String | Non | — | Prédit les futurs points de données à l'aide de l'entraînement IA. Consultez Paramètre : forecasting. |
abnormaldetect |
String | Non | — | Détecte les anomalies dans une série temporelle à l'aide de l'entraînement IA. Consultez Paramètre : abnormaldetect. |
Une seule requête prend en charge un maximum de 200 sous-requêtes.
Sitagsetfilterssont tous deux spécifiés, le paramètre qui apparaît en dernier dans le JSON prend effet.
Exemple de requête
POST /api/query
{
"start": 1356998400,
"end": 1356998460,
"queries": [
{
"aggregator": "sum",
"metric": "sys.cpu.0"
},
{
"aggregator": "sum",
"metric": "sys.cpu.1"
}
]
}
Éléments de la réponse
Une requête réussie renvoie un code HTTP 200 avec un tableau JSON. Chaque élément correspond au résultat d'une sous-requête.
| Paramètre | Description |
|---|---|
metric |
Le nom de la métrique. |
tags |
Les tags dont les valeurs n'ont pas été agrégées. |
aggregateTags |
Les tags dont les valeurs ont été agrégées. |
dps |
Les points de données sous forme de paires horodatage-valeur. |
Exemple de réponse
[
{
"metric": "tsd.hbase.puts",
"tags": {"appName": "hitsdb"},
"aggregateTags": ["host"],
"dps": {
"1365966001": 25595461080,
"1365966061": 25595542522,
"1365966062": 25595543979,
"1365973801": 25717417859
}
}
]
Paramètre : limit et offset
Utilisez limit et offset conjointement pour paginer les résultats au sein d'une sous-requête.
limit: le nombre maximal de points de données à renvoyer par série temporelle. La valeur par défaut0signifie qu'il n'y a aucune limite.offset: le nombre de points de données à ignorer par série temporelle. La valeur par défaut0signifie qu'aucun point de données n'est ignoré.
Ni limit ni offset ne peuvent être définis sur un nombre négatif.
Pour récupérer les points de données classés de 1001 à 1500, définissez limit sur 500 et offset sur 1000 :
{
"start": 1346046400,
"end": 1347056500,
"queries": [
{
"aggregator": "avg",
"downsample": "2s-sum",
"metric": "sys.cpu.0",
"limit": "500",
"offset": "1000",
"tags": {
"host": "localhost",
"appName": "hitsdb"
}
}
]
}
Paramètre : dpValue
Filtre les points de données par valeur après l'agrégation. Opérateurs pris en charge : >, <, =, <=, >=, !=.
Lorsque la valeur du filtre est une chaîne, seuls = et != sont pris en charge.
Exemple
{
"start": 1346046400,
"end": 1347056500,
"queries": [
{
"aggregator": "avg",
"downsample": "2s-sum",
"metric": "sys.cpu.0",
"dpValue": ">=500",
"tags": {
"host": "localhost",
"appName": "hitsdb"
}
}
]
}
Paramètre : delta
Lorsque delta est défini sur true, chaque valeur de la réponse dps représente la différence calculée entre les points de données consécutifs. Si le résultat original contient n paires clé-valeur, le résultat delta contient n−1 paires ; la première paire est supprimée car aucune valeur précédente n'existe pour le calcul. L'opérateur delta s'applique également aux valeurs après le sous-échantillonnage.
deltaOptions
Configurez deltaOptions dans la sous-requête pour contrôler le calcul des différences.
| Paramètre | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
counter |
Boolean | Non | false |
Traite les valeurs de métrique comme des comptes cumulatifs monotones croissants ou décroissants (similaire à un compteur). Le serveur ne valide pas les valeurs de la métrique. |
counterMax |
Integer | Non | — | Le seuil pour les valeurs delta lorsque counter est true. Si la valeur absolue du delta dépasse ce seuil, le delta est considéré comme anormal. Lorsqu'il n'est pas défini, aucun seuil n'est appliqué. |
dropReset |
Boolean | Non | false |
Contrôle le comportement pour les deltas anormaux lorsque counterMax est défini. Si true, les deltas anormaux sont ignorés. Si false, les deltas anormaux sont réinitialisés à 0. |
Exemple
{
"start": 1346046400,
"end": 1347056500,
"queries": [
{
"aggregator": "none",
"downsample": "5s-avg",
"delta": true,
"deltaOptions": {
"counter": true,
"counterMax": 100
},
"metric": "sys.cpu.0",
"dpValue": ">=50",
"tags": {
"host": "localhost",
"appName": "hitsdb"
}
}
]
}
Paramètre : downsample
Le sous-échantillonnage agrège les données sur un intervalle de temps spécifié, ce qui est utile lors de l'interrogation de données sur de longues plages de temps. La plage de temps est divisée en fenêtres de l'intervalle spécifié, et chaque horodatage renvoyé marque le début d'une fenêtre.
Format
<interval><units>-<aggregator>[-<fill policy>]
Lorsque downsample est spécifié, TSDB étend automatiquement la plage de requête d'un intervalle de chaque côté. Par exemple, une plage de [1346846401, 1346846499] avec un intervalle de 5 minutes devient [1346846101, 1346846799].
Champs
interval
Une valeur numérique telle que 5 ou 60. Utilisez 0all pour agréger tous les points de données de la plage en une seule valeur.
units
| Valeur | Unité |
|---|---|
s |
Secondes |
m |
Minutes |
h |
Heures |
d |
Jours |
n |
Mois |
y |
Années |
Par défaut, les horodatages sont alignés par troncature modulo : Aligned timestamp = Data timestamp − (Data timestamp % Time interval) .
Pour un alignement sur un intervalle calendaire (par exemple, de 00:00 à 00:00 le jour suivant), ajoutezcà l'unité :1dc.
aggregator
| Opérateur | Description |
|---|---|
avg |
Valeur moyenne |
count |
Nombre de points de données |
first |
Première valeur |
last |
Dernière valeur |
min |
Valeur minimale |
max |
Valeur maximale |
median |
Valeur médiane |
sum |
Somme des valeurs |
zimsum |
Somme des valeurs (avec interpolation par zéro) |
rfirst |
Identique à first, mais renvoie l'horodatage d'origine au lieu de l'horodatage aligné |
rlast |
Identique à last, mais renvoie l'horodatage d'origine au lieu de l'horodatage aligné |
rmin |
Identique à min, mais renvoie l'horodatage d'origine au lieu de l'horodatage aligné |
rmax |
Identique à max, mais renvoie l'horodatage d'origine au lieu de l'horodatage aligné |
Les opérateursrfirst,rlast,rminetrmaxne peuvent pas être utilisés avec une politique de remplissage dans la même expression de sous-échantillonnage.
Politiques de remplissage
Les politiques de remplissage définissent la manière dont TSDB comble les valeurs manquantes dans les résultats de sous-échantillonnage. Lorsqu'aucune donnée n'existe dans une fenêtre temporelle, TSDB applique la politique de remplissage pour produire une valeur.
| Politique de remplissage | Remplit les valeurs manquantes avec |
|---|---|
none |
Aucun remplissage (par défaut) |
nan |
null |
null |
null |
zero |
0 |
linear |
Une valeur calculée par interpolation linéaire |
previous |
La valeur précédente |
near |
La valeur adjacente la plus proche |
after |
La valeur suivante |
fixed |
Une valeur fixe spécifiée par l'utilisateur |
Politique de remplissage fixe
Pour remplir les valeurs manquantes avec un nombre fixe, utilisez le format suivant :
<interval><units>-<aggregator>-fixed#<number>
La valeur fixe peut être positive ou négative. Exemples : 1h-sum-fixed#6, 1h-avg-fixed#-8.
Exemples de sous-échantillonnage
1m-avg, 1h-sum-zero, 1h-sum-near
Le paramètre downsample est facultatif. Pour désactiver explicitement le sous-échantillonnage, définissez-le sur null ou sur une chaîne vide : {"downsample": null} ou {"downsample": ""}.
Paramètre : aggregator
Après le sous-échantillonnage, TSDB fusionne plusieurs séries chronologiques en une seule en agrégeant les valeurs à chaque horodatage aligné. L'agrégation est ignorée lorsqu'une seule série chronologique correspond à la requête.
Interpolation
Lors de l'agrégation de plusieurs séries chronologiques, si une série ne possède pas de valeur à un horodatage donné, elle reçoit une valeur interpolée, à condition qu'aucune politique de remplissage ne soit spécifiée et qu'au moins une autre série ait une valeur à cet horodatage.
Par exemple, lors de la fusion de deux séries chronologiques avec {"downsample": "10s-avg", "aggregator": "sum"} :
La série chronologique 1 possède des valeurs aux horodatages
t+0,t+10,t+20ett+30.La série chronologique 2 possède des valeurs aux horodatages
t+0,t+20ett+30.
Avant l'agrégation, TSDB interpole une valeur pour la série chronologique 2 à l'horodatage t+10. La méthode d'interpolation dépend de l'agrégateur :
| Opérateur | Description | Méthode d'interpolation |
|---|---|---|
avg |
Valeur moyenne | Interpolation linéaire |
count |
Nombre de points de données | 0 interpolé |
mimmin |
Valeur minimale | Valeur maximale interpolée |
mimmax |
Valeur maximale | Valeur minimale interpolée |
min |
Valeur minimale | Interpolation linéaire |
max |
Valeur maximale | Interpolation linéaire |
none |
Ignore l'agrégation | 0 interpolé |
sum |
Somme des valeurs | Interpolation linéaire |
zimsum |
Somme des valeurs | 0 interpolé |
Paramètre : filters
Le paramètre filters accepte une liste d'objets filtre JSON pour le filtrage basé sur les tags. Il est mutuellement exclusif avec le paramètre tags.
Paramètres de l'objet filtre
| Paramètre | Type | Obligatoire | Par défaut | Description | |
|---|---|---|---|---|---|
type |
String | Oui | — | Le type de filtre. Consultez la section Types de filtres. Exemple : literal_or. |
|
tagk |
String | Oui | — | La clé de tag sur laquelle appliquer le filtre. Exemple : host. |
|
filter |
String | Oui | — | L'expression de filtre. Exemple : `web01 |
web02`. |
groupBy |
Boolean | Non | false |
Indique s'il faut effectuer une opération GROUP BY sur les valeurs de tag correspondantes. |
Vous pouvez également utiliser des expressions de tag abrégées directement dans la sous-requête :
tagk = *: effectue un GROUP BY sur toutes les valeurs de la clé de tag.tagk = tagv1|tagv2: agrège séparément les valeurstagv1ettagv2.
Types de filtres
| Type de filtre | Exemple | Description | ||
|---|---|---|---|---|
literal_or |
`web01 |
web02` |
Correspond aux valeurs de tag exactes séparées par |
`. Sensible à la casse. |
wildcard |
*.example.com |
Correspond aux valeurs de tag à l'aide d'un modèle générique. Sensible à la casse. |
Exemple sans filtres
{
"start": 1356998400,
"end": 1356998460,
"queries": [
{
"aggregator": "sum",
"metric": "sys.cpu.0",
"rate": "true",
"tags": {
"host": "*",
"dc": "lga"
}
}
]
}
Exemple avec filtres
{
"start": 1356998400,
"end": 1356998460,
"queries": [
{
"aggregator": "sum",
"metric": "sys.cpu.0",
"rate": "true",
"filters": [
{
"type": "wildcard",
"tagk": "host",
"filter": "*",
"groupBy": true
},
{
"type": "literal_or",
"tagk": "dc",
"filter": "lga|lga1|lga2",
"groupBy": false
}
]
}
]
}
Paramètre : hint
Un indice de requête réduit le temps de réponse en contrôlant les index de clés de tag que TSDB utilise lors de l'exécution de la requête. Par exemple, si les séries temporelles correspondant à l'ensemble de tags B constituent un sous-ensemble de celles correspondant à l'ensemble A, vous pouvez indiquer à TSDB d'utiliser uniquement l'index pour B, évitant ainsi la surcharge liée à la lecture de A.
Le paramètre hint peut être défini au niveau supérieur (s'applique à l'ensemble de la requête) ou dans une sous-requête (s'applique uniquement à cette sous-requête).
La version actuelle de TSDB prend uniquement en charge le paramètre tagk dans un indice.
Format
Dans la map tagk, définissez chaque clé de tag sur 1 pour utiliser son index, ou sur 0 pour l'ignorer. Toutes les valeurs doivent être soit 0 soit 1 ; mélanger les deux dans le même indice provoque une erreur.
Version requise : TSDB V2.6.1 et versions ultérieures.
Indice appliqué à une sous-requête
{
"start": 1346846400,
"end": 1346846400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"tags": {
"dc": "lga",
"host": "web01"
},
"hint": {
"tagk": {
"dc": 1
}
}
}
]
}
Indice appliqué à l'ensemble de la requête
{
"start": 1346846400,
"end": 1346846400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"tags": {
"dc": "lga",
"host": "web01"
}
}
],
"hint": {
"tagk": {
"dc": 1
}
}
}
Cas d'erreur
Mélange de valeurs 0 et 1
La requête suivante génère une erreur, car la valeur de dc est 1 et celle de host est 0 :
{
"start": 1346846400,
"end": 1346846400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"tags": {
"dc": "lga",
"host": "web01"
}
}
],
"hint": {
"tagk": {
"dc": 1,
"host": 0
}
}
}
Réponse d'erreur :
{
"error": {
"code": 400,
"message": "The value of hint should only be 0 or 1, and there should not be both 0 and 1",
"details": "TSQuery(start_time=1346846400, end_time=1346846400, subQueries[TSSubQuery(metric=sys.cpu.nice, filters=[filter_name=literal_or, tagk=dc, literals=[lga], group_by=true, filter_name=literal_or, tagk=host, literals=[web01], group_by=true], tsuids=[], agg=none, downsample=null, ds_interval=0, rate=false, rate_options=null, delta=false, delta_options=null, top=0, granularity=null, granularityDownsample=null, explicit_tags=explicit_tags, index=0, realTimeSeconds=-1, useData=auto, limit=0, offset=0, dpValue=null, preDpValue=null, startTime=1346846400000, endTime=1346846400000, Query_ID=null)] padding=false, no_annotations=false, with_global_annotations=false, show_tsuids=false, ms_resolution=false, options=[])"
}
}
Valeur différente de 0 ou 1
{
"start": 1346846400,
"end": 1346846400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"tags": {
"dc": "lga",
"host": "web01"
}
}
],
"hint": {
"tagk": {
"dc": 100
}
}
}
Réponse d'erreur :
{
"error": {
"code": 400,
"message": "The value of hint can only be 0 or 1, and it is detected that '100' is passed in",
"details": "TSQuery(start_time=1346846400, end_time=1346846400, subQueries[TSSubQuery(metric=sys.cpu.nice, filters=[filter_name=literal_or, tagk=dc, literals=[lga], group_by=true, filter_name=literal_or, tagk=host, literals=[web01], group_by=true], tsuids=[], agg=none, downsample=null, ds_interval=0, rate=false, rate_options=null, delta=false, delta_options=null, top=0, granularity=null, granularityDownsample=null, explicit_tags=explicit_tags, index=0, realTimeSeconds=-1, useData=auto, limit=0, offset=0, dpValue=null, preDpValue=null, startTime=1346846400000, endTime=1346846400000, Query_ID=null)] padding=false, no_annotations=false, with_global_annotations=false, show_tsuids=false, ms_resolution=false, options=[])"
}
}
Paramètre : forecasting
Ce paramètre utilise l'apprentissage automatique sur des données de séries temporelles historiques pour prédire les points de données futurs. TSDB s'appuie sur les données existantes afin d'identifier les tendances et les cycles, puis projette les valeurs à venir.
Format
<AlgorithmName>-<ForecastPointCount>[-<ForecastPolicy>]
Algorithmes pris en charge
-
arima— Modèle ARIMA (AutoRegressive Integrated Moving Average). Le paramètreForecastPolicypour ARIMA comprend deux champs :delta: ordre de différenciation. Valeur par défaut :1. Augmentez cette valeur pour réduire les fluctuations des données.seasonality: longueur du cycle exprimée en nombre de points de données. Valeur par défaut :1. Définissez ce paramètre en fonction du cycle naturel des données (par exemple,10si les données fluctuent tous les 10 points).
-
holtwinters— Lissage exponentiel de Holt-Winters. Le paramètreForecastPolicypour Holt-Winters comprend un champ :seasonality: identique à ARIMA. Valeur par défaut :1.
Exemples : arima-1, arima-48-1-48, holtwinters-1-1
Exemple
Considérez les données existantes de la série suivantes :
[
{
"metric": "sys.cpu.nice",
"tags": {"dc": "lga", "host": "web00"},
"aggregateTags": [],
"dps": {
"1346837400": 1,
"1346837401": 2,
"1346837402": 3,
"1346837403": 4,
"1346837404": 5,
"1346837405": 6,
"1346837406": 7,
"1346837407": 8,
"1346837408": 9,
"1346837409": 10,
"1346837410": 11,
"1346837411": 12
}
}
]
Requête :
{
"start": 1346837400,
"end": 1346847400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"forecasting": "arima-1"
}
]
}
Résultat de la prévision (un point de données supplémentaire est ajouté) :
[
{
"metric": "sys.cpu.nice",
"tags": {"dc": "lga", "host": "web00"},
"aggregateTags": [],
"dps": {
"1346837400": 1,
"1346837401": 2,
"1346837402": 3,
"1346837403": 4,
"1346837404": 5,
"1346837405": 6,
"1346837406": 7,
"1346837407": 8,
"1346837408": 9,
"1346837409": 10,
"1346837410": 11,
"1346837411": 12,
"1346837412": 13
}
}
]
Paramètre : abnormaldetect
Ce paramètre utilise l'algorithme STL (Seasonal-Trend decomposition using Loess) pour détecter les anomalies dans une série temporelle. TSDB analyse les données existantes afin d'identifier les modèles, puis signale les points de données qui s'écartent significativement de la plage attendue.
Format
<AlgorithmName>[-<Sigma>-<NP>-<NS>-<NT>-<NL>]
Seul l'algorithme STL est pris en charge. Si vous ne maîtrisez pas le réglage des paramètres STL, utilisez les valeurs par défaut en omettant les champs de paramètres.
Paramètres
| Paramètre | Description |
|---|---|
AlgorithmName |
Nom de l'algorithme. Utilisez stl. |
Sigma |
Seuil d'anomalie. Un point de données est signalé comme anormal si la différence absolue entre sa valeur et la moyenne de la série dépasse Sigma × écart type. Valeur typique : 3.0. |
NP |
Nombre de points de données par cycle. |
NS |
Paramètre de lissage saisonnier. |
NT |
Paramètre de lissage de la tendance. |
NL |
Paramètre de lissage du filtre passe-bas. |
Exemples
"abnormaldetect": "stl"
"abnormaldetect": "stl-5-5-7-0-0"
Exemple de requête
{
"start": 1346836400,
"end": 1346946400,
"queries": [
{
"aggregator": "none",
"metric": "sys.cpu.nice",
"abnormaldetect": "stl-5-5-7-0-0",
"filters": [
{
"type": "literal_or",
"tagk": "dc",
"filter": "lga",
"groupBy": false
},
{
"type": "literal_or",
"tagk": "host",
"filter": "web00",
"groupBy": false
}
]
}
]
}
Sortie de la détection d'anomalies
Chaque valeur dans dps est un tableau au format suivant :
[srcValue, upperValue, lowerValue, predictValue, isAbnormal]
| Champ | Description |
|---|---|
srcValue |
Valeur du point de données d'origine. |
upperValue |
Limite supérieure de la plage attendue. |
lowerValue |
Limite inférieure de la plage attendue. |
predictValue |
Valeur prédite par l'algorithme STL. |
isAbnormal |
0 — normal. 1 — anormal. |
Exemple de sortie
[
{
"metric": "sys.cpu.nice",
"tags": {"dc": "lga", "host": "web00"},
"aggregateTags": [],
"dps": {
"1346837400": [1, 1.0000000000000049, 0.9999999999999973, 1.0000000000000013, 0],
"1346837401": [2, 2.0000000000000036, 1.9999999999999958, 1.9999999999999998, 0],
"1346837402": [3, 3.0000000000000036, 2.9999999999999956, 3, 0],
"1346837403": [4, 4.0000000000000036, 3.9999999999999956, 4, 1],
"1346837404": [5, 5.0000000000000036, 4.9999999999999964, 5, 0],
"1346837405": [6, 6.000000000000002, 5.999999999999995, 5.999999999999998, 0],
"1346837406": [7, 7.0000000000000036, 6.9999999999999964, 7, 1],
"1346837407": [8, 8.000000000000004, 7.9999999999999964, 8, 0],
"1346837408": [9, 9.000000000000004, 8.999999999999996, 9, 0],
"1346837409": [10, 10.000000000000004, 9.999999999999996, 10, 0],
"1346837410": [11, 11.000000000000005, 10.999999999999998, 11.000000000000002, 0],
"1346837411": [12, 12.000000000000004, 11.999999999999996, 12, 0]
}
}
]