[{"data":1,"prerenderedAt":2158},["ShallowReactive",2],{"blog-en-/en/blog/time-series-data-management-amazon-timestream":3},{"id":4,"title":5,"body":6,"description":2142,"extension":2143,"meta":2144,"navigation":246,"path":2154,"seo":2155,"stem":2156,"__hash__":2157},"en_blog/en/blog/time-series-data-management-amazon-timestream.md","Time Series Data Management with Amazon Timestream",{"type":7,"value":8,"toc":2111},"minimark",[9,14,27,41,45,51,56,84,88,175,179,190,194,198,314,319,333,337,342,384,390,499,503,507,961,965,969,974,1027,1032,1087,1092,1213,1217,1222,1376,1381,1438,1442,1446,1451,1470,1475,1613,1617,1622,1677,1682,1696,1700,1704,1773,1777,1782,1821,1826,1883,1888,1931,1935,1941,2021,2024,2028,2033,2065,2080,2084,2107],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17,18,22,23,26],"p",{},"Traditional relational databases (PostgreSQL, MySQL) are not optimized for ",[19,20,21],"strong",{},"time series data"," from industrial sensors. ",[19,24,25],{},"Amazon Timestream"," is a fully managed time series database offering 10x faster writes and 1/10 the cost.",[15,28,29,30,35,36,40],{},"In this article, we examine how to efficiently store and analyze data from our ",[31,32,34],"a",{"href":33},"/en/products/zma-data-acquisition","ZMA Data Acquisition"," and ",[31,37,39],{"href":38},"/en/products/gdt-digital-transmitter","GDT Digital Transmitter"," devices using AWS Timestream.",[10,42,44],{"id":43},"what-is-time-series-data","What is Time Series Data?",[15,46,47,50],{},[19,48,49],{},"Time series data:"," Data points recorded at sequential time intervals.",[52,53,55],"h3",{"id":54},"industrial-examples","Industrial Examples",[57,58,59,66,72,78],"ul",{},[60,61,62,65],"li",{},[19,63,64],{},"Weight measurement:"," Tank weight every second",[60,67,68,71],{},[19,69,70],{},"Temperature:"," Oven temperature every 5 seconds",[60,73,74,77],{},[19,75,76],{},"Vibration:"," Motor vibration 1000 samples/second",[60,79,80,83],{},[19,81,82],{},"Energy consumption:"," Power meter every 15 minutes",[52,85,87],{"id":86},"relational-db-vs-time-series-db","Relational DB vs Time Series DB",[89,90,91,106],"table",{},[92,93,94],"thead",{},[95,96,97,101,104],"tr",{},[98,99,100],"th",{},"Feature",[98,102,103],{},"PostgreSQL",[98,105,25],{},[107,108,109,123,136,149,162],"tbody",{},[95,110,111,117,120],{},[112,113,114],"td",{},[19,115,116],{},"Write Speed",[112,118,119],{},"~10K/sec",[112,121,122],{},"~100K/sec",[95,124,125,130,133],{},[112,126,127],{},[19,128,129],{},"Compression",[112,131,132],{},"~30%",[112,134,135],{},"~90% (10x better)",[95,137,138,143,146],{},[112,139,140],{},[19,141,142],{},"Time Queries",[112,144,145],{},"Complex SQL",[112,147,148],{},"Native time functions",[95,150,151,156,159],{},[112,152,153],{},[19,154,155],{},"Auto-Tiering",[112,157,158],{},"Manual partitioning",[112,160,161],{},"Automatic (Memory→Magnetic)",[95,163,164,169,172],{},[112,165,166],{},[19,167,168],{},"Cost (1TB/month)",[112,170,171],{},"~$200",[112,173,174],{},"~$20",[10,176,178],{"id":177},"system-architecture","System Architecture",[180,181,186],"pre",{"className":182,"code":184,"language":185},[183],"language-text","┌─────────────────────────────────────────────────┐\n│              Factory Network                    │\n│                                                 │\n│  ┌─────────┐    Modbus TCP   ┌──────────────┐  │\n│  │ ZMA/GDT │◄────────────────►│  IoT Gateway │  │\n│  │ Devices │                  │ (Python)     │  │\n│  └─────────┘                  └──────┬───────┘  │\n└─────────────────────────────────────┼───────────┘\n                                      │ MQTT\n                                      │ TLS 8883\n                                      ▼\n                         ┌────────────────────────┐\n                         │      AWS Cloud         │\n                         │                        │\n                         │  ┌──────────────────┐  │\n                         │  │   IoT Core       │  │\n                         │  └────────┬─────────┘  │\n                         │           │            │\n                         │  ┌────────▼─────────┐  │\n                         │  │   Timestream     │  │\n                         │  │   Database       │  │\n                         │  │                  │  │\n                         │  │  Memory Store    │  │\n                         │  │  (Recent data)   │  │\n                         │  │        ▼         │  │\n                         │  │  Magnetic Store  │  │\n                         │  │  (Historical)    │  │\n                         │  └────────┬─────────┘  │\n                         │           │            │\n                         │  ┌────────▼─────────┐  │\n                         │  │    Grafana       │  │\n                         │  │   Dashboards     │  │\n                         │  └──────────────────┘  │\n                         └────────────────────────┘\n","text",[187,188,184],"code",{"__ignoreMap":189},"",[10,191,193],{"id":192},"timestream-database-setup","Timestream Database Setup",[52,195,197],{"id":196},"_1-create-database-and-table","1. Create Database and Table",[180,199,203],{"className":200,"code":201,"language":202,"meta":189,"style":189},"language-bash shiki shiki-themes github-light github-dark","# Create database\naws timestream-write create-database \\\n  --database-name FactoryData\n\n# Create table\naws timestream-write create-table \\\n  --database-name FactoryData \\\n  --table-name TankWeights \\\n  --retention-properties '{\n    \"MemoryStoreRetentionPeriodInHours\": 24,\n    \"MagneticStoreRetentionPeriodInDays\": 90\n  }'\n","bash",[187,204,205,214,232,241,248,254,266,276,287,296,302,308],{"__ignoreMap":189},[206,207,210],"span",{"class":208,"line":209},"line",1,[206,211,213],{"class":212},"sJ8bj","# Create database\n",[206,215,217,221,225,228],{"class":208,"line":216},2,[206,218,220],{"class":219},"sScJk","aws",[206,222,224],{"class":223},"sZZnC"," timestream-write",[206,226,227],{"class":223}," create-database",[206,229,231],{"class":230},"sj4cs"," \\\n",[206,233,235,238],{"class":208,"line":234},3,[206,236,237],{"class":230},"  --database-name",[206,239,240],{"class":223}," FactoryData\n",[206,242,244],{"class":208,"line":243},4,[206,245,247],{"emptyLinePlaceholder":246},true,"\n",[206,249,251],{"class":208,"line":250},5,[206,252,253],{"class":212},"# Create table\n",[206,255,257,259,261,264],{"class":208,"line":256},6,[206,258,220],{"class":219},[206,260,224],{"class":223},[206,262,263],{"class":223}," create-table",[206,265,231],{"class":230},[206,267,269,271,274],{"class":208,"line":268},7,[206,270,237],{"class":230},[206,272,273],{"class":223}," FactoryData",[206,275,231],{"class":230},[206,277,279,282,285],{"class":208,"line":278},8,[206,280,281],{"class":230},"  --table-name",[206,283,284],{"class":223}," TankWeights",[206,286,231],{"class":230},[206,288,290,293],{"class":208,"line":289},9,[206,291,292],{"class":230},"  --retention-properties",[206,294,295],{"class":223}," '{\n",[206,297,299],{"class":208,"line":298},10,[206,300,301],{"class":223},"    \"MemoryStoreRetentionPeriodInHours\": 24,\n",[206,303,305],{"class":208,"line":304},11,[206,306,307],{"class":223},"    \"MagneticStoreRetentionPeriodInDays\": 90\n",[206,309,311],{"class":208,"line":310},12,[206,312,313],{"class":223},"  }'\n",[15,315,316],{},[19,317,318],{},"Retention Policy:",[57,320,321,327],{},[60,322,323,326],{},[19,324,325],{},"Memory Store (24 hours):"," Fast queries for recent data",[60,328,329,332],{},[19,330,331],{},"Magnetic Store (90 days):"," Cost-effective long-term storage",[52,334,336],{"id":335},"_2-iot-core-rule-to-write-to-timestream","2. IoT Core Rule to Write to Timestream",[15,338,339],{},[19,340,341],{},"IoT Rule SQL:",[180,343,347],{"className":344,"code":345,"language":346,"meta":189,"style":189},"language-sql shiki shiki-themes github-light github-dark","SELECT\n  device_name as device_id,\n  values.net_weight as weight,\n  values.temperature as temperature,\n  timestamp\nFROM\n  'amazeng/factory/tank/+/data'\n","sql",[187,348,349,354,359,364,369,374,379],{"__ignoreMap":189},[206,350,351],{"class":208,"line":209},[206,352,353],{},"SELECT\n",[206,355,356],{"class":208,"line":216},[206,357,358],{},"  device_name as device_id,\n",[206,360,361],{"class":208,"line":234},[206,362,363],{},"  values.net_weight as weight,\n",[206,365,366],{"class":208,"line":243},[206,367,368],{},"  values.temperature as temperature,\n",[206,370,371],{"class":208,"line":250},[206,372,373],{},"  timestamp\n",[206,375,376],{"class":208,"line":256},[206,377,378],{},"FROM\n",[206,380,381],{"class":208,"line":268},[206,382,383],{},"  'amazeng/factory/tank/+/data'\n",[15,385,386,389],{},[19,387,388],{},"Action:"," Timestream",[180,391,395],{"className":392,"code":393,"language":394,"meta":189,"style":189},"language-json shiki shiki-themes github-light github-dark","{\n  \"databaseName\": \"FactoryData\",\n  \"tableName\": \"TankWeights\",\n  \"dimensions\": [{ \"name\": \"device_id\", \"value\": \"${device_id}\" }],\n  \"timestamp\": {\n    \"value\": \"${timestamp}\",\n    \"unit\": \"MILLISECONDS\"\n  }\n}\n","json",[187,396,397,403,417,429,459,467,479,489,494],{"__ignoreMap":189},[206,398,399],{"class":208,"line":209},[206,400,402],{"class":401},"sVt8B","{\n",[206,404,405,408,411,414],{"class":208,"line":216},[206,406,407],{"class":230},"  \"databaseName\"",[206,409,410],{"class":401},": ",[206,412,413],{"class":223},"\"FactoryData\"",[206,415,416],{"class":401},",\n",[206,418,419,422,424,427],{"class":208,"line":234},[206,420,421],{"class":230},"  \"tableName\"",[206,423,410],{"class":401},[206,425,426],{"class":223},"\"TankWeights\"",[206,428,416],{"class":401},[206,430,431,434,437,440,442,445,448,451,453,456],{"class":208,"line":243},[206,432,433],{"class":230},"  \"dimensions\"",[206,435,436],{"class":401},": [{ ",[206,438,439],{"class":230},"\"name\"",[206,441,410],{"class":401},[206,443,444],{"class":223},"\"device_id\"",[206,446,447],{"class":401},", ",[206,449,450],{"class":230},"\"value\"",[206,452,410],{"class":401},[206,454,455],{"class":223},"\"${device_id}\"",[206,457,458],{"class":401}," }],\n",[206,460,461,464],{"class":208,"line":250},[206,462,463],{"class":230},"  \"timestamp\"",[206,465,466],{"class":401},": {\n",[206,468,469,472,474,477],{"class":208,"line":256},[206,470,471],{"class":230},"    \"value\"",[206,473,410],{"class":401},[206,475,476],{"class":223},"\"${timestamp}\"",[206,478,416],{"class":401},[206,480,481,484,486],{"class":208,"line":268},[206,482,483],{"class":230},"    \"unit\"",[206,485,410],{"class":401},[206,487,488],{"class":223},"\"MILLISECONDS\"\n",[206,490,491],{"class":208,"line":278},[206,492,493],{"class":401},"  }\n",[206,495,496],{"class":208,"line":289},[206,497,498],{"class":401},"}\n",[10,500,502],{"id":501},"data-ingestion-python-example","Data Ingestion: Python Example",[52,504,506],{"id":505},"write-data-to-timestream","Write Data to Timestream",[180,508,512],{"className":509,"code":510,"language":511,"meta":189,"style":189},"language-python shiki shiki-themes github-light github-dark","import boto3\nimport time\nfrom datetime import datetime\n\nclass TimestreamWriter:\n    def __init__(self, database_name, table_name):\n        self.client = boto3.client('timestream-write', region_name='eu-west-1')\n        self.database = database_name\n        self.table = table_name\n\n    def write_weight_data(self, tank_id, weight, temperature):\n        \"\"\"Write single measurement\"\"\"\n        current_time = str(int(time.time() * 1000))  # Milliseconds\n\n        records = [\n            {\n                'Dimensions': [\n                    {'Name': 'tank_id', 'Value': str(tank_id)},\n                    {'Name': 'location', 'Value': 'Istanbul-Factory'},\n                ],\n                'MeasureName': 'metrics',\n                'MeasureValues': [\n                    {'Name': 'weight', 'Value': str(weight), 'Type': 'DOUBLE'},\n                    {'Name': 'temperature', 'Value': str(temperature), 'Type': 'DOUBLE'}\n                ],\n                'MeasureValueType': 'MULTI',\n                'Time': current_time\n            }\n        ]\n\n        try:\n            result = self.client.write_records(\n                DatabaseName=self.database,\n                TableName=self.table,\n                Records=records\n            )\n            print(f\"✓ Written: Tank {tank_id} - {weight} kg\")\n            return result\n        except Exception as e:\n            print(f\"✗ Error: {e}\")\n            return None\n\n    def write_batch(self, data_list):\n        \"\"\"Write multiple measurements (up to 100)\"\"\"\n        records = []\n        current_time = str(int(time.time() * 1000))\n\n        for data in data_list:\n            records.append({\n                'Dimensions': [\n                    {'Name': 'tank_id', 'Value': str(data['tank_id'])},\n                ],\n                'MeasureName': 'weight',\n                'MeasureValue': str(data['weight']),\n                'MeasureValueType': 'DOUBLE',\n                'Time': current_time\n            })\n\n        result = self.client.write_records(\n            DatabaseName=self.database,\n            TableName=self.table,\n            Records=records\n        )\n\n        return result\n\n# Usage\nwriter = TimestreamWriter('FactoryData', 'TankWeights')\n\n# Single write\nwriter.write_weight_data(tank_id=1, weight=4523.5, temperature=4.2)\n\n# Batch write\nbatch_data = [\n    {'tank_id': 1, 'weight': 4523.5},\n    {'tank_id': 2, 'weight': 3890.2},\n    {'tank_id': 3, 'weight': 4102.8}\n]\nwriter.write_batch(batch_data)\n","python",[187,513,514,519,524,529,533,538,543,548,553,558,562,567,572,578,583,589,595,601,607,613,619,625,631,637,643,648,654,660,666,672,677,683,689,695,701,707,713,719,725,731,737,743,748,754,760,766,772,777,783,789,794,800,805,811,817,823,828,834,839,845,851,857,863,869,874,880,885,891,897,902,908,914,919,925,931,937,943,949,955],{"__ignoreMap":189},[206,515,516],{"class":208,"line":209},[206,517,518],{},"import boto3\n",[206,520,521],{"class":208,"line":216},[206,522,523],{},"import time\n",[206,525,526],{"class":208,"line":234},[206,527,528],{},"from datetime import datetime\n",[206,530,531],{"class":208,"line":243},[206,532,247],{"emptyLinePlaceholder":246},[206,534,535],{"class":208,"line":250},[206,536,537],{},"class TimestreamWriter:\n",[206,539,540],{"class":208,"line":256},[206,541,542],{},"    def __init__(self, database_name, table_name):\n",[206,544,545],{"class":208,"line":268},[206,546,547],{},"        self.client = boto3.client('timestream-write', region_name='eu-west-1')\n",[206,549,550],{"class":208,"line":278},[206,551,552],{},"        self.database = database_name\n",[206,554,555],{"class":208,"line":289},[206,556,557],{},"        self.table = table_name\n",[206,559,560],{"class":208,"line":298},[206,561,247],{"emptyLinePlaceholder":246},[206,563,564],{"class":208,"line":304},[206,565,566],{},"    def write_weight_data(self, tank_id, weight, temperature):\n",[206,568,569],{"class":208,"line":310},[206,570,571],{},"        \"\"\"Write single measurement\"\"\"\n",[206,573,575],{"class":208,"line":574},13,[206,576,577],{},"        current_time = str(int(time.time() * 1000))  # Milliseconds\n",[206,579,581],{"class":208,"line":580},14,[206,582,247],{"emptyLinePlaceholder":246},[206,584,586],{"class":208,"line":585},15,[206,587,588],{},"        records = [\n",[206,590,592],{"class":208,"line":591},16,[206,593,594],{},"            {\n",[206,596,598],{"class":208,"line":597},17,[206,599,600],{},"                'Dimensions': [\n",[206,602,604],{"class":208,"line":603},18,[206,605,606],{},"                    {'Name': 'tank_id', 'Value': str(tank_id)},\n",[206,608,610],{"class":208,"line":609},19,[206,611,612],{},"                    {'Name': 'location', 'Value': 'Istanbul-Factory'},\n",[206,614,616],{"class":208,"line":615},20,[206,617,618],{},"                ],\n",[206,620,622],{"class":208,"line":621},21,[206,623,624],{},"                'MeasureName': 'metrics',\n",[206,626,628],{"class":208,"line":627},22,[206,629,630],{},"                'MeasureValues': [\n",[206,632,634],{"class":208,"line":633},23,[206,635,636],{},"                    {'Name': 'weight', 'Value': str(weight), 'Type': 'DOUBLE'},\n",[206,638,640],{"class":208,"line":639},24,[206,641,642],{},"                    {'Name': 'temperature', 'Value': str(temperature), 'Type': 'DOUBLE'}\n",[206,644,646],{"class":208,"line":645},25,[206,647,618],{},[206,649,651],{"class":208,"line":650},26,[206,652,653],{},"                'MeasureValueType': 'MULTI',\n",[206,655,657],{"class":208,"line":656},27,[206,658,659],{},"                'Time': current_time\n",[206,661,663],{"class":208,"line":662},28,[206,664,665],{},"            }\n",[206,667,669],{"class":208,"line":668},29,[206,670,671],{},"        ]\n",[206,673,675],{"class":208,"line":674},30,[206,676,247],{"emptyLinePlaceholder":246},[206,678,680],{"class":208,"line":679},31,[206,681,682],{},"        try:\n",[206,684,686],{"class":208,"line":685},32,[206,687,688],{},"            result = self.client.write_records(\n",[206,690,692],{"class":208,"line":691},33,[206,693,694],{},"                DatabaseName=self.database,\n",[206,696,698],{"class":208,"line":697},34,[206,699,700],{},"                TableName=self.table,\n",[206,702,704],{"class":208,"line":703},35,[206,705,706],{},"                Records=records\n",[206,708,710],{"class":208,"line":709},36,[206,711,712],{},"            )\n",[206,714,716],{"class":208,"line":715},37,[206,717,718],{},"            print(f\"✓ Written: Tank {tank_id} - {weight} kg\")\n",[206,720,722],{"class":208,"line":721},38,[206,723,724],{},"            return result\n",[206,726,728],{"class":208,"line":727},39,[206,729,730],{},"        except Exception as e:\n",[206,732,734],{"class":208,"line":733},40,[206,735,736],{},"            print(f\"✗ Error: {e}\")\n",[206,738,740],{"class":208,"line":739},41,[206,741,742],{},"            return None\n",[206,744,746],{"class":208,"line":745},42,[206,747,247],{"emptyLinePlaceholder":246},[206,749,751],{"class":208,"line":750},43,[206,752,753],{},"    def write_batch(self, data_list):\n",[206,755,757],{"class":208,"line":756},44,[206,758,759],{},"        \"\"\"Write multiple measurements (up to 100)\"\"\"\n",[206,761,763],{"class":208,"line":762},45,[206,764,765],{},"        records = []\n",[206,767,769],{"class":208,"line":768},46,[206,770,771],{},"        current_time = str(int(time.time() * 1000))\n",[206,773,775],{"class":208,"line":774},47,[206,776,247],{"emptyLinePlaceholder":246},[206,778,780],{"class":208,"line":779},48,[206,781,782],{},"        for data in data_list:\n",[206,784,786],{"class":208,"line":785},49,[206,787,788],{},"            records.append({\n",[206,790,792],{"class":208,"line":791},50,[206,793,600],{},[206,795,797],{"class":208,"line":796},51,[206,798,799],{},"                    {'Name': 'tank_id', 'Value': str(data['tank_id'])},\n",[206,801,803],{"class":208,"line":802},52,[206,804,618],{},[206,806,808],{"class":208,"line":807},53,[206,809,810],{},"                'MeasureName': 'weight',\n",[206,812,814],{"class":208,"line":813},54,[206,815,816],{},"                'MeasureValue': str(data['weight']),\n",[206,818,820],{"class":208,"line":819},55,[206,821,822],{},"                'MeasureValueType': 'DOUBLE',\n",[206,824,826],{"class":208,"line":825},56,[206,827,659],{},[206,829,831],{"class":208,"line":830},57,[206,832,833],{},"            })\n",[206,835,837],{"class":208,"line":836},58,[206,838,247],{"emptyLinePlaceholder":246},[206,840,842],{"class":208,"line":841},59,[206,843,844],{},"        result = self.client.write_records(\n",[206,846,848],{"class":208,"line":847},60,[206,849,850],{},"            DatabaseName=self.database,\n",[206,852,854],{"class":208,"line":853},61,[206,855,856],{},"            TableName=self.table,\n",[206,858,860],{"class":208,"line":859},62,[206,861,862],{},"            Records=records\n",[206,864,866],{"class":208,"line":865},63,[206,867,868],{},"        )\n",[206,870,872],{"class":208,"line":871},64,[206,873,247],{"emptyLinePlaceholder":246},[206,875,877],{"class":208,"line":876},65,[206,878,879],{},"        return result\n",[206,881,883],{"class":208,"line":882},66,[206,884,247],{"emptyLinePlaceholder":246},[206,886,888],{"class":208,"line":887},67,[206,889,890],{},"# Usage\n",[206,892,894],{"class":208,"line":893},68,[206,895,896],{},"writer = TimestreamWriter('FactoryData', 'TankWeights')\n",[206,898,900],{"class":208,"line":899},69,[206,901,247],{"emptyLinePlaceholder":246},[206,903,905],{"class":208,"line":904},70,[206,906,907],{},"# Single write\n",[206,909,911],{"class":208,"line":910},71,[206,912,913],{},"writer.write_weight_data(tank_id=1, weight=4523.5, temperature=4.2)\n",[206,915,917],{"class":208,"line":916},72,[206,918,247],{"emptyLinePlaceholder":246},[206,920,922],{"class":208,"line":921},73,[206,923,924],{},"# Batch write\n",[206,926,928],{"class":208,"line":927},74,[206,929,930],{},"batch_data = [\n",[206,932,934],{"class":208,"line":933},75,[206,935,936],{},"    {'tank_id': 1, 'weight': 4523.5},\n",[206,938,940],{"class":208,"line":939},76,[206,941,942],{},"    {'tank_id': 2, 'weight': 3890.2},\n",[206,944,946],{"class":208,"line":945},77,[206,947,948],{},"    {'tank_id': 3, 'weight': 4102.8}\n",[206,950,952],{"class":208,"line":951},78,[206,953,954],{},"]\n",[206,956,958],{"class":208,"line":957},79,[206,959,960],{},"writer.write_batch(batch_data)\n",[10,962,964],{"id":963},"querying-data-with-sql","Querying Data with SQL",[52,966,968],{"id":967},"basic-queries","Basic Queries",[15,970,971],{},[19,972,973],{},"1. Latest Weight per Tank:",[180,975,977],{"className":344,"code":976,"language":346,"meta":189,"style":189},"SELECT\n  tank_id,\n  measure_value::double as weight,\n  time\nFROM\n  \"FactoryData\".\"TankWeights\"\nWHERE\n  time > ago(5m)\nORDER BY\n  time DESC\n",[187,978,979,983,988,993,998,1002,1007,1012,1017,1022],{"__ignoreMap":189},[206,980,981],{"class":208,"line":209},[206,982,353],{},[206,984,985],{"class":208,"line":216},[206,986,987],{},"  tank_id,\n",[206,989,990],{"class":208,"line":234},[206,991,992],{},"  measure_value::double as weight,\n",[206,994,995],{"class":208,"line":243},[206,996,997],{},"  time\n",[206,999,1000],{"class":208,"line":250},[206,1001,378],{},[206,1003,1004],{"class":208,"line":256},[206,1005,1006],{},"  \"FactoryData\".\"TankWeights\"\n",[206,1008,1009],{"class":208,"line":268},[206,1010,1011],{},"WHERE\n",[206,1013,1014],{"class":208,"line":278},[206,1015,1016],{},"  time > ago(5m)\n",[206,1018,1019],{"class":208,"line":289},[206,1020,1021],{},"ORDER BY\n",[206,1023,1024],{"class":208,"line":298},[206,1025,1026],{},"  time DESC\n",[15,1028,1029],{},[19,1030,1031],{},"2. Average Weight (Last Hour):",[180,1033,1035],{"className":344,"code":1034,"language":346,"meta":189,"style":189},"SELECT\n  tank_id,\n  AVG(measure_value::double) as avg_weight,\n  COUNT(*) as sample_count\nFROM\n  \"FactoryData\".\"TankWeights\"\nWHERE\n  time > ago(1h)\n  AND measure_name = 'weight'\nGROUP BY\n  tank_id\n",[187,1036,1037,1041,1045,1050,1055,1059,1063,1067,1072,1077,1082],{"__ignoreMap":189},[206,1038,1039],{"class":208,"line":209},[206,1040,353],{},[206,1042,1043],{"class":208,"line":216},[206,1044,987],{},[206,1046,1047],{"class":208,"line":234},[206,1048,1049],{},"  AVG(measure_value::double) as avg_weight,\n",[206,1051,1052],{"class":208,"line":243},[206,1053,1054],{},"  COUNT(*) as sample_count\n",[206,1056,1057],{"class":208,"line":250},[206,1058,378],{},[206,1060,1061],{"class":208,"line":256},[206,1062,1006],{},[206,1064,1065],{"class":208,"line":268},[206,1066,1011],{},[206,1068,1069],{"class":208,"line":278},[206,1070,1071],{},"  time > ago(1h)\n",[206,1073,1074],{"class":208,"line":289},[206,1075,1076],{},"  AND measure_name = 'weight'\n",[206,1078,1079],{"class":208,"line":298},[206,1080,1081],{},"GROUP BY\n",[206,1083,1084],{"class":208,"line":304},[206,1085,1086],{},"  tank_id\n",[15,1088,1089],{},[19,1090,1091],{},"3. Fill Rate (kg/hour):",[180,1093,1095],{"className":344,"code":1094,"language":346,"meta":189,"style":189},"WITH binned_data AS (\n  SELECT\n    tank_id,\n    bin(time, 1h) as hour_bin,\n    AVG(measure_value::double) as avg_weight\n  FROM\n    \"FactoryData\".\"TankWeights\"\n  WHERE\n    time > ago(24h)\n  GROUP BY\n    tank_id, bin(time, 1h)\n)\nSELECT\n  tank_id,\n  hour_bin,\n  avg_weight,\n  avg_weight - LAG(avg_weight) OVER (\n    PARTITION BY tank_id\n    ORDER BY hour_bin\n  ) as fill_rate_per_hour\nFROM\n  binned_data\nORDER BY\n  tank_id, hour_bin DESC\n",[187,1096,1097,1102,1107,1112,1117,1122,1127,1132,1137,1142,1147,1152,1157,1161,1165,1170,1175,1180,1185,1190,1195,1199,1204,1208],{"__ignoreMap":189},[206,1098,1099],{"class":208,"line":209},[206,1100,1101],{},"WITH binned_data AS (\n",[206,1103,1104],{"class":208,"line":216},[206,1105,1106],{},"  SELECT\n",[206,1108,1109],{"class":208,"line":234},[206,1110,1111],{},"    tank_id,\n",[206,1113,1114],{"class":208,"line":243},[206,1115,1116],{},"    bin(time, 1h) as hour_bin,\n",[206,1118,1119],{"class":208,"line":250},[206,1120,1121],{},"    AVG(measure_value::double) as avg_weight\n",[206,1123,1124],{"class":208,"line":256},[206,1125,1126],{},"  FROM\n",[206,1128,1129],{"class":208,"line":268},[206,1130,1131],{},"    \"FactoryData\".\"TankWeights\"\n",[206,1133,1134],{"class":208,"line":278},[206,1135,1136],{},"  WHERE\n",[206,1138,1139],{"class":208,"line":289},[206,1140,1141],{},"    time > ago(24h)\n",[206,1143,1144],{"class":208,"line":298},[206,1145,1146],{},"  GROUP BY\n",[206,1148,1149],{"class":208,"line":304},[206,1150,1151],{},"    tank_id, bin(time, 1h)\n",[206,1153,1154],{"class":208,"line":310},[206,1155,1156],{},")\n",[206,1158,1159],{"class":208,"line":574},[206,1160,353],{},[206,1162,1163],{"class":208,"line":580},[206,1164,987],{},[206,1166,1167],{"class":208,"line":585},[206,1168,1169],{},"  hour_bin,\n",[206,1171,1172],{"class":208,"line":591},[206,1173,1174],{},"  avg_weight,\n",[206,1176,1177],{"class":208,"line":597},[206,1178,1179],{},"  avg_weight - LAG(avg_weight) OVER (\n",[206,1181,1182],{"class":208,"line":603},[206,1183,1184],{},"    PARTITION BY tank_id\n",[206,1186,1187],{"class":208,"line":609},[206,1188,1189],{},"    ORDER BY hour_bin\n",[206,1191,1192],{"class":208,"line":615},[206,1193,1194],{},"  ) as fill_rate_per_hour\n",[206,1196,1197],{"class":208,"line":621},[206,1198,378],{},[206,1200,1201],{"class":208,"line":627},[206,1202,1203],{},"  binned_data\n",[206,1205,1206],{"class":208,"line":633},[206,1207,1021],{},[206,1209,1210],{"class":208,"line":639},[206,1211,1212],{},"  tank_id, hour_bin DESC\n",[52,1214,1216],{"id":1215},"advanced-analytics","Advanced Analytics",[15,1218,1219],{},[19,1220,1221],{},"4. Anomaly Detection (Statistical):",[180,1223,1225],{"className":344,"code":1224,"language":346,"meta":189,"style":189},"WITH stats AS (\n  SELECT\n    tank_id,\n    AVG(measure_value::double) as mean_weight,\n    STDDEV(measure_value::double) as stddev_weight\n  FROM\n    \"FactoryData\".\"TankWeights\"\n  WHERE\n    time BETWEEN ago(7d) AND ago(1d)\n  GROUP BY\n    tank_id\n)\nSELECT\n  t.tank_id,\n  t.time,\n  t.measure_value::double as weight,\n  s.mean_weight,\n  s.stddev_weight,\n  ABS(t.measure_value::double - s.mean_weight) / s.stddev_weight as z_score,\n  CASE\n    WHEN ABS(t.measure_value::double - s.mean_weight) / s.stddev_weight > 3\n    THEN 'ANOMALY'\n    ELSE 'NORMAL'\n  END as status\nFROM\n  \"FactoryData\".\"TankWeights\" t\nJOIN\n  stats s ON t.tank_id = s.tank_id\nWHERE\n  t.time > ago(1h)\nORDER BY\n  z_score DESC\n",[187,1226,1227,1232,1236,1240,1245,1250,1254,1258,1262,1267,1271,1276,1280,1284,1289,1294,1299,1304,1309,1314,1319,1324,1329,1334,1339,1343,1348,1353,1358,1362,1367,1371],{"__ignoreMap":189},[206,1228,1229],{"class":208,"line":209},[206,1230,1231],{},"WITH stats AS (\n",[206,1233,1234],{"class":208,"line":216},[206,1235,1106],{},[206,1237,1238],{"class":208,"line":234},[206,1239,1111],{},[206,1241,1242],{"class":208,"line":243},[206,1243,1244],{},"    AVG(measure_value::double) as mean_weight,\n",[206,1246,1247],{"class":208,"line":250},[206,1248,1249],{},"    STDDEV(measure_value::double) as stddev_weight\n",[206,1251,1252],{"class":208,"line":256},[206,1253,1126],{},[206,1255,1256],{"class":208,"line":268},[206,1257,1131],{},[206,1259,1260],{"class":208,"line":278},[206,1261,1136],{},[206,1263,1264],{"class":208,"line":289},[206,1265,1266],{},"    time BETWEEN ago(7d) AND ago(1d)\n",[206,1268,1269],{"class":208,"line":298},[206,1270,1146],{},[206,1272,1273],{"class":208,"line":304},[206,1274,1275],{},"    tank_id\n",[206,1277,1278],{"class":208,"line":310},[206,1279,1156],{},[206,1281,1282],{"class":208,"line":574},[206,1283,353],{},[206,1285,1286],{"class":208,"line":580},[206,1287,1288],{},"  t.tank_id,\n",[206,1290,1291],{"class":208,"line":585},[206,1292,1293],{},"  t.time,\n",[206,1295,1296],{"class":208,"line":591},[206,1297,1298],{},"  t.measure_value::double as weight,\n",[206,1300,1301],{"class":208,"line":597},[206,1302,1303],{},"  s.mean_weight,\n",[206,1305,1306],{"class":208,"line":603},[206,1307,1308],{},"  s.stddev_weight,\n",[206,1310,1311],{"class":208,"line":609},[206,1312,1313],{},"  ABS(t.measure_value::double - s.mean_weight) / s.stddev_weight as z_score,\n",[206,1315,1316],{"class":208,"line":615},[206,1317,1318],{},"  CASE\n",[206,1320,1321],{"class":208,"line":621},[206,1322,1323],{},"    WHEN ABS(t.measure_value::double - s.mean_weight) / s.stddev_weight > 3\n",[206,1325,1326],{"class":208,"line":627},[206,1327,1328],{},"    THEN 'ANOMALY'\n",[206,1330,1331],{"class":208,"line":633},[206,1332,1333],{},"    ELSE 'NORMAL'\n",[206,1335,1336],{"class":208,"line":639},[206,1337,1338],{},"  END as status\n",[206,1340,1341],{"class":208,"line":645},[206,1342,378],{},[206,1344,1345],{"class":208,"line":650},[206,1346,1347],{},"  \"FactoryData\".\"TankWeights\" t\n",[206,1349,1350],{"class":208,"line":656},[206,1351,1352],{},"JOIN\n",[206,1354,1355],{"class":208,"line":662},[206,1356,1357],{},"  stats s ON t.tank_id = s.tank_id\n",[206,1359,1360],{"class":208,"line":668},[206,1361,1011],{},[206,1363,1364],{"class":208,"line":674},[206,1365,1366],{},"  t.time > ago(1h)\n",[206,1368,1369],{"class":208,"line":679},[206,1370,1021],{},[206,1372,1373],{"class":208,"line":685},[206,1374,1375],{},"  z_score DESC\n",[15,1377,1378],{},[19,1379,1380],{},"5. Data Interpolation (Missing Values):",[180,1382,1384],{"className":344,"code":1383,"language":346,"meta":189,"style":189},"SELECT\n  tank_id,\n  INTERPOLATE_LINEAR(\n    CREATE_TIME_SERIES(time, measure_value::double),\n    SEQUENCE(ago(1h), now(), 1m)\n  ) as interpolated_weights\nFROM\n  \"FactoryData\".\"TankWeights\"\nWHERE\n  time > ago(1h)\nGROUP BY\n  tank_id\n",[187,1385,1386,1390,1394,1399,1404,1409,1414,1418,1422,1426,1430,1434],{"__ignoreMap":189},[206,1387,1388],{"class":208,"line":209},[206,1389,353],{},[206,1391,1392],{"class":208,"line":216},[206,1393,987],{},[206,1395,1396],{"class":208,"line":234},[206,1397,1398],{},"  INTERPOLATE_LINEAR(\n",[206,1400,1401],{"class":208,"line":243},[206,1402,1403],{},"    CREATE_TIME_SERIES(time, measure_value::double),\n",[206,1405,1406],{"class":208,"line":250},[206,1407,1408],{},"    SEQUENCE(ago(1h), now(), 1m)\n",[206,1410,1411],{"class":208,"line":256},[206,1412,1413],{},"  ) as interpolated_weights\n",[206,1415,1416],{"class":208,"line":268},[206,1417,378],{},[206,1419,1420],{"class":208,"line":278},[206,1421,1006],{},[206,1423,1424],{"class":208,"line":289},[206,1425,1011],{},[206,1427,1428],{"class":208,"line":298},[206,1429,1071],{},[206,1431,1432],{"class":208,"line":304},[206,1433,1081],{},[206,1435,1436],{"class":208,"line":310},[206,1437,1086],{},[10,1439,1441],{"id":1440},"grafana-integration","Grafana Integration",[52,1443,1445],{"id":1444},"add-timestream-data-source","Add Timestream Data Source",[15,1447,1448],{},[19,1449,1450],{},"Grafana Plugin:",[180,1452,1454],{"className":200,"code":1453,"language":202,"meta":189,"style":189},"grafana-cli plugins install grafana-timestream-datasource\n",[187,1455,1456],{"__ignoreMap":189},[206,1457,1458,1461,1464,1467],{"class":208,"line":209},[206,1459,1460],{"class":219},"grafana-cli",[206,1462,1463],{"class":223}," plugins",[206,1465,1466],{"class":223}," install",[206,1468,1469],{"class":223}," grafana-timestream-datasource\n",[15,1471,1472],{},[19,1473,1474],{},"Data Source Configuration:",[180,1476,1478],{"className":392,"code":1477,"language":394,"meta":189,"style":189},"{\n  \"name\": \"AWS Timestream\",\n  \"type\": \"grafana-timestream-datasource\",\n  \"access\": \"proxy\",\n  \"jsonData\": {\n    \"defaultRegion\": \"eu-west-1\",\n    \"defaultDatabase\": \"FactoryData\",\n    \"defaultTable\": \"TankWeights\",\n    \"authType\": \"keys\"\n  },\n  \"secureJsonData\": {\n    \"accessKey\": \"AKIA...\",\n    \"secretKey\": \"...\"\n  }\n}\n",[187,1479,1480,1484,1496,1508,1520,1527,1539,1550,1561,1571,1576,1583,1595,1605,1609],{"__ignoreMap":189},[206,1481,1482],{"class":208,"line":209},[206,1483,402],{"class":401},[206,1485,1486,1489,1491,1494],{"class":208,"line":216},[206,1487,1488],{"class":230},"  \"name\"",[206,1490,410],{"class":401},[206,1492,1493],{"class":223},"\"AWS Timestream\"",[206,1495,416],{"class":401},[206,1497,1498,1501,1503,1506],{"class":208,"line":234},[206,1499,1500],{"class":230},"  \"type\"",[206,1502,410],{"class":401},[206,1504,1505],{"class":223},"\"grafana-timestream-datasource\"",[206,1507,416],{"class":401},[206,1509,1510,1513,1515,1518],{"class":208,"line":243},[206,1511,1512],{"class":230},"  \"access\"",[206,1514,410],{"class":401},[206,1516,1517],{"class":223},"\"proxy\"",[206,1519,416],{"class":401},[206,1521,1522,1525],{"class":208,"line":250},[206,1523,1524],{"class":230},"  \"jsonData\"",[206,1526,466],{"class":401},[206,1528,1529,1532,1534,1537],{"class":208,"line":256},[206,1530,1531],{"class":230},"    \"defaultRegion\"",[206,1533,410],{"class":401},[206,1535,1536],{"class":223},"\"eu-west-1\"",[206,1538,416],{"class":401},[206,1540,1541,1544,1546,1548],{"class":208,"line":268},[206,1542,1543],{"class":230},"    \"defaultDatabase\"",[206,1545,410],{"class":401},[206,1547,413],{"class":223},[206,1549,416],{"class":401},[206,1551,1552,1555,1557,1559],{"class":208,"line":278},[206,1553,1554],{"class":230},"    \"defaultTable\"",[206,1556,410],{"class":401},[206,1558,426],{"class":223},[206,1560,416],{"class":401},[206,1562,1563,1566,1568],{"class":208,"line":289},[206,1564,1565],{"class":230},"    \"authType\"",[206,1567,410],{"class":401},[206,1569,1570],{"class":223},"\"keys\"\n",[206,1572,1573],{"class":208,"line":298},[206,1574,1575],{"class":401},"  },\n",[206,1577,1578,1581],{"class":208,"line":304},[206,1579,1580],{"class":230},"  \"secureJsonData\"",[206,1582,466],{"class":401},[206,1584,1585,1588,1590,1593],{"class":208,"line":310},[206,1586,1587],{"class":230},"    \"accessKey\"",[206,1589,410],{"class":401},[206,1591,1592],{"class":223},"\"AKIA...\"",[206,1594,416],{"class":401},[206,1596,1597,1600,1602],{"class":208,"line":574},[206,1598,1599],{"class":230},"    \"secretKey\"",[206,1601,410],{"class":401},[206,1603,1604],{"class":223},"\"...\"\n",[206,1606,1607],{"class":208,"line":580},[206,1608,493],{"class":401},[206,1610,1611],{"class":208,"line":585},[206,1612,498],{"class":401},[52,1614,1616],{"id":1615},"example-dashboard-query","Example Dashboard Query",[15,1618,1619],{},[19,1620,1621],{},"Panel: Tank Weight Over Time",[180,1623,1625],{"className":344,"code":1624,"language":346,"meta":189,"style":189},"SELECT\n  tank_id as metric,\n  time,\n  measure_value::double as weight\nFROM\n  $__database.$__table\nWHERE\n  $__timeFilter\n  AND tank_id IN ($tank_ids)\nORDER BY\n  time\n",[187,1626,1627,1631,1636,1641,1646,1650,1655,1659,1664,1669,1673],{"__ignoreMap":189},[206,1628,1629],{"class":208,"line":209},[206,1630,353],{},[206,1632,1633],{"class":208,"line":216},[206,1634,1635],{},"  tank_id as metric,\n",[206,1637,1638],{"class":208,"line":234},[206,1639,1640],{},"  time,\n",[206,1642,1643],{"class":208,"line":243},[206,1644,1645],{},"  measure_value::double as weight\n",[206,1647,1648],{"class":208,"line":250},[206,1649,378],{},[206,1651,1652],{"class":208,"line":256},[206,1653,1654],{},"  $__database.$__table\n",[206,1656,1657],{"class":208,"line":268},[206,1658,1011],{},[206,1660,1661],{"class":208,"line":278},[206,1662,1663],{},"  $__timeFilter\n",[206,1665,1666],{"class":208,"line":289},[206,1667,1668],{},"  AND tank_id IN ($tank_ids)\n",[206,1670,1671],{"class":208,"line":298},[206,1672,1021],{},[206,1674,1675],{"class":208,"line":304},[206,1676,997],{},[15,1678,1679],{},[19,1680,1681],{},"Variables:",[57,1683,1684,1690],{},[60,1685,1686,1689],{},[187,1687,1688],{},"$tank_ids",": Multi-select dropdown (1, 2, 3)",[60,1691,1692,1695],{},[187,1693,1694],{},"$__timeFilter",": Grafana auto-generated time filter",[10,1697,1699],{"id":1698},"cost-optimization","Cost Optimization",[52,1701,1703],{"id":1702},"pricing-eu-west-1","Pricing (eu-west-1)",[89,1705,1706,1719],{},[92,1707,1708],{},[95,1709,1710,1713,1716],{},[98,1711,1712],{},"Component",[98,1714,1715],{},"Price",[98,1717,1718],{},"Example Cost",[107,1720,1721,1734,1747,1760],{},[95,1722,1723,1728,1731],{},[112,1724,1725],{},[19,1726,1727],{},"Writes",[112,1729,1730],{},"$0.50 / million writes",[112,1732,1733],{},"$1.30/day (100K writes/day)",[95,1735,1736,1741,1744],{},[112,1737,1738],{},[19,1739,1740],{},"Memory Store",[112,1742,1743],{},"$0.036 / GB-hour",[112,1745,1746],{},"$0.86/day (1GB, 24h)",[95,1748,1749,1754,1757],{},[112,1750,1751],{},[19,1752,1753],{},"Magnetic Store",[112,1755,1756],{},"$0.03 / GB-month",[112,1758,1759],{},"$30/month (1TB)",[95,1761,1762,1767,1770],{},[112,1763,1764],{},[19,1765,1766],{},"Queries (scanned)",[112,1768,1769],{},"$0.01 / GB scanned",[112,1771,1772],{},"Variable",[52,1774,1776],{"id":1775},"cost-optimization-strategies","Cost Optimization Strategies",[15,1778,1779],{},[19,1780,1781],{},"1. Batch Writes:",[180,1783,1785],{"className":509,"code":1784,"language":511,"meta":189,"style":189},"# ❌ Bad: 1000 individual writes = $0.50\nfor i in range(1000):\n    write_single_record(data[i])\n\n# ✅ Good: 10 batch writes (100 records each) = $0.005\nfor batch in chunks(data, 100):\n    write_batch(batch)\n",[187,1786,1787,1792,1797,1802,1806,1811,1816],{"__ignoreMap":189},[206,1788,1789],{"class":208,"line":209},[206,1790,1791],{},"# ❌ Bad: 1000 individual writes = $0.50\n",[206,1793,1794],{"class":208,"line":216},[206,1795,1796],{},"for i in range(1000):\n",[206,1798,1799],{"class":208,"line":234},[206,1800,1801],{},"    write_single_record(data[i])\n",[206,1803,1804],{"class":208,"line":243},[206,1805,247],{"emptyLinePlaceholder":246},[206,1807,1808],{"class":208,"line":250},[206,1809,1810],{},"# ✅ Good: 10 batch writes (100 records each) = $0.005\n",[206,1812,1813],{"class":208,"line":256},[206,1814,1815],{},"for batch in chunks(data, 100):\n",[206,1817,1818],{"class":208,"line":268},[206,1819,1820],{},"    write_batch(batch)\n",[15,1822,1823],{},[19,1824,1825],{},"2. Shorter Retention:",[180,1827,1829],{"className":200,"code":1828,"language":202,"meta":189,"style":189},"# Reduce Memory Store to 12 hours instead of 24\naws timestream-write update-table \\\n  --database-name FactoryData \\\n  --table-name TankWeights \\\n  --retention-properties '{\n    \"MemoryStoreRetentionPeriodInHours\": 12,\n    \"MagneticStoreRetentionPeriodInDays\": 30\n  }'\n",[187,1830,1831,1836,1847,1855,1863,1869,1874,1879],{"__ignoreMap":189},[206,1832,1833],{"class":208,"line":209},[206,1834,1835],{"class":212},"# Reduce Memory Store to 12 hours instead of 24\n",[206,1837,1838,1840,1842,1845],{"class":208,"line":216},[206,1839,220],{"class":219},[206,1841,224],{"class":223},[206,1843,1844],{"class":223}," update-table",[206,1846,231],{"class":230},[206,1848,1849,1851,1853],{"class":208,"line":234},[206,1850,237],{"class":230},[206,1852,273],{"class":223},[206,1854,231],{"class":230},[206,1856,1857,1859,1861],{"class":208,"line":243},[206,1858,281],{"class":230},[206,1860,284],{"class":223},[206,1862,231],{"class":230},[206,1864,1865,1867],{"class":208,"line":250},[206,1866,292],{"class":230},[206,1868,295],{"class":223},[206,1870,1871],{"class":208,"line":256},[206,1872,1873],{"class":223},"    \"MemoryStoreRetentionPeriodInHours\": 12,\n",[206,1875,1876],{"class":208,"line":268},[206,1877,1878],{"class":223},"    \"MagneticStoreRetentionPeriodInDays\": 30\n",[206,1880,1881],{"class":208,"line":278},[206,1882,313],{"class":223},[15,1884,1885],{},[19,1886,1887],{},"3. Query Optimization:",[180,1889,1891],{"className":344,"code":1890,"language":346,"meta":189,"style":189},"-- ❌ Bad: Scans entire table\nSELECT * FROM TankWeights\n\n-- ✅ Good: Limited time range + specific columns\nSELECT tank_id, time, measure_value::double\nFROM TankWeights\nWHERE time > ago(1h)\n  AND measure_name = 'weight'\n",[187,1892,1893,1898,1903,1907,1912,1917,1922,1927],{"__ignoreMap":189},[206,1894,1895],{"class":208,"line":209},[206,1896,1897],{},"-- ❌ Bad: Scans entire table\n",[206,1899,1900],{"class":208,"line":216},[206,1901,1902],{},"SELECT * FROM TankWeights\n",[206,1904,1905],{"class":208,"line":234},[206,1906,247],{"emptyLinePlaceholder":246},[206,1908,1909],{"class":208,"line":243},[206,1910,1911],{},"-- ✅ Good: Limited time range + specific columns\n",[206,1913,1914],{"class":208,"line":250},[206,1915,1916],{},"SELECT tank_id, time, measure_value::double\n",[206,1918,1919],{"class":208,"line":256},[206,1920,1921],{},"FROM TankWeights\n",[206,1923,1924],{"class":208,"line":268},[206,1925,1926],{},"WHERE time > ago(1h)\n",[206,1928,1929],{"class":208,"line":278},[206,1930,1076],{},[52,1932,1934],{"id":1933},"real-world-cost-example","Real-World Cost Example",[15,1936,1937,1940],{},[19,1938,1939],{},"Scenario:"," 10 tanks, 1-second polling, 90-day retention",[89,1942,1943,1956],{},[92,1944,1945],{},[95,1946,1947,1950,1953],{},[98,1948,1949],{},"Item",[98,1951,1952],{},"Calculation",[98,1954,1955],{},"Monthly Cost",[107,1957,1958,1970,1982,1994,2007],{},[95,1959,1960,1964,1967],{},[112,1961,1962],{},[19,1963,1727],{},[112,1965,1966],{},"10 devices × 86,400/day × 30 days = 25.9M writes",[112,1968,1969],{},"$12.95",[95,1971,1972,1976,1979],{},[112,1973,1974],{},[19,1975,1740],{},[112,1977,1978],{},"10 devices × 0.1 GB/day × 1 day × $0.036/hour",[112,1980,1981],{},"$0.86",[95,1983,1984,1988,1991],{},[112,1985,1986],{},[19,1987,1753],{},[112,1989,1990],{},"25.9M × 50 bytes = 1.3 GB/month",[112,1992,1993],{},"$0.04",[95,1995,1996,2001,2004],{},[112,1997,1998],{},[19,1999,2000],{},"Queries",[112,2002,2003],{},"~100 GB scanned/month",[112,2005,2006],{},"$1.00",[95,2008,2009,2014,2016],{},[112,2010,2011],{},[19,2012,2013],{},"TOTAL",[112,2015],{},[112,2017,2018],{},[19,2019,2020],{},"~$15/month",[15,2022,2023],{},"Compare to self-hosted PostgreSQL: $50-100/month (EC2 + EBS)",[10,2025,2027],{"id":2026},"conclusion","Conclusion",[15,2029,2030,2032],{},[19,2031,25],{}," is the ideal solution for storing and analyzing data from industrial sensors:",[15,2034,2035,2036,2039,2040,2043,2044,2047,2048,2043,2050,2053,2054,2043,2056,2058,2059,2043,2061,2064],{},"✅ ",[19,2037,2038],{},"10x faster"," writes than relational databases",[2041,2042],"br",{},"\n✅ ",[19,2045,2046],{},"90% compression"," (10x cost savings)",[2041,2049],{},[19,2051,2052],{},"Automatic lifecycle management"," (Memory → Magnetic)",[2041,2055],{},[19,2057,148],{}," (interpolation, binning, windowing)",[2041,2060],{},[19,2062,2063],{},"Grafana integration"," for real-time dashboards",[15,2066,2067,2068,35,2071,2074,2075,2079],{},"Our ",[31,2069,2070],{"href":33},"ZMA",[31,2072,2073],{"href":38},"GDT"," devices can be easily integrated with Timestream via ",[31,2076,2078],{"href":2077},"/en/blog/industrial-data-collection-with-aws-iot-core","AWS IoT Core"," for complete cloud-based monitoring.",[52,2081,2083],{"id":2082},"related-resources","Related Resources",[57,2085,2086,2091,2097,2103],{},[60,2087,2088],{},[31,2089,2090],{"href":2077},"Industrial Data Collection with AWS IoT Core",[60,2092,2093],{},[31,2094,2096],{"href":2095},"/en/blog/aws-bedrock-industrial-generative-ai","Industrial AI with AWS Bedrock",[60,2098,2099],{},[31,2100,2102],{"href":2101},"/en/solutions/cloud-iot-data-collection","Cloud & IoT Data Collection",[60,2104,2105],{},[31,2106,34],{"href":33},[2108,2109,2110],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":189,"searchDepth":216,"depth":216,"links":2112},[2113,2114,2118,2119,2123,2126,2130,2134,2139],{"id":12,"depth":216,"text":13},{"id":43,"depth":216,"text":44,"children":2115},[2116,2117],{"id":54,"depth":234,"text":55},{"id":86,"depth":234,"text":87},{"id":177,"depth":216,"text":178},{"id":192,"depth":216,"text":193,"children":2120},[2121,2122],{"id":196,"depth":234,"text":197},{"id":335,"depth":234,"text":336},{"id":501,"depth":216,"text":502,"children":2124},[2125],{"id":505,"depth":234,"text":506},{"id":963,"depth":216,"text":964,"children":2127},[2128,2129],{"id":967,"depth":234,"text":968},{"id":1215,"depth":234,"text":1216},{"id":1440,"depth":216,"text":1441,"children":2131},[2132,2133],{"id":1444,"depth":234,"text":1445},{"id":1615,"depth":234,"text":1616},{"id":1698,"depth":216,"text":1699,"children":2135},[2136,2137,2138],{"id":1702,"depth":234,"text":1703},{"id":1775,"depth":234,"text":1776},{"id":1933,"depth":234,"text":1934},{"id":2026,"depth":216,"text":2027,"children":2140},[2141],{"id":2082,"depth":234,"text":2083},"Efficient storage and analysis of industrial sensor data with AWS Timestream: High-speed writes, automated lifecycle management, and SQL-based analytics.","md",{"date":2145,"author":2146,"readTime":289,"tags":2147},"2025-12-29","Amazeng Technical Team",[2148,2149,2150,2151,2152,2153],"AWS Timestream","Time Series Database","Industrial IoT","Data Analytics","Grafana","SQL","/en/blog/time-series-data-management-amazon-timestream",{"title":5,"description":2142},"en/blog/time-series-data-management-amazon-timestream","TZ1kYsoC8qyX_UWY9E3sJi-F7kznHbXCKdldmoZmzJk",1778229658774]