<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>InfluxData Blog - Developer</title>
    <description>Posts from the Developer category on the InfluxData Blog</description>
    <link>https://www.influxdata.com/blog/category/tech/</link>
    <language>en-us</language>
    <lastBuildDate>Wed, 19 Aug 2026 08:00:00 +0000</lastBuildDate>
    <pubDate>Wed, 19 Aug 2026 08:00:00 +0000</pubDate>
    <ttl>1800</ttl>
    <item>
      <title>A Guide to Downsampling Time Series Data with InfluxDB 3</title>
      <description>&lt;p&gt;This tutorial demonstrates both approaches using the InfluxDB 3 Processing Engine’s built-in bird tracking simulator plugin. You will generate telemetry, aggregate it into 10-second windows, and validate the result with SQL. The same pattern works for infrastructure metrics, industrial sensors, application telemetry, and other time series workloads.&lt;/p&gt;

&lt;h2 id="why-downsample-time-series-data"&gt;Why downsample time series data?&lt;/h2&gt;

&lt;p&gt;High-resolution data is valuable while diagnosing a recent event, but its value often changes as it ages. A temperature reading collected every second may be useful for an active incident, while a daily report may only need 10-minute or hourly averages.&lt;/p&gt;

&lt;p&gt;Downsampling helps you:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;scan fewer rows in long-range queries&lt;/li&gt;
  &lt;li&gt;make dashboards over weeks or months more responsive&lt;/li&gt;
  &lt;li&gt;retain useful historical trends at a lower resolution, reducing storage costs&lt;/li&gt;
  &lt;li&gt;calculate common summaries once instead of repeating the work&lt;/li&gt;
  &lt;li&gt;keep raw data only for as long as its full resolution is useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Downsampling is not the same as deleting raw data; it creates a summarized view or table at a lower granularity. Retention is a separate decision and process where data is fully deleted after a set period of time.&lt;/p&gt;

&lt;h4 id="choose-query-time-or-persisted-downsampling"&gt;Choose Query-Time or Persisted Downsampling&lt;/h4&gt;

&lt;p&gt;InfluxDB 3 gives you two practical patterns for downsampling:&lt;/p&gt;

&lt;div class="blog-html-table-wrapper"&gt;
 &lt;table class="blog-html-table"&gt;
  &lt;thead&gt;
   &lt;tr&gt;
    &lt;th&gt;Approach&lt;/th&gt;
    &lt;th&gt;How it works&lt;/th&gt;
    &lt;th&gt;Best for&lt;/th&gt;
    &lt;th&gt;Main tradeoff&lt;/th&gt;
   &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
   &lt;tr&gt;
    &lt;td&gt;Query-time SQL&lt;/td&gt;
    &lt;td&gt;Uses &lt;code&gt;DATE_BIN&lt;/code&gt; and aggregate functions in a &lt;code&gt;SELECT&lt;/code&gt; query&lt;/td&gt;
    &lt;td&gt;Exploration, flexible dashboards, and changing aggregation requirements&lt;/td&gt;
    &lt;td&gt;Recomputes the result each time and does not reduce stored raw data&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;Python Processing Engine&lt;/td&gt;
    &lt;td&gt;Runs the official downsampler plugin on a schedule and writes aggregate rows to a target table&lt;/td&gt;
    &lt;td&gt;Repeated long-range queries, predictable rollups, and tiered retention&lt;/td&gt;
    &lt;td&gt;Requires you to choose aggregates and scheduling behavior in advance&lt;/td&gt;
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;A useful starting point is to develop and validate an aggregate in SQL. If the same query becomes a frequent or expensive workload, then use the downsampler plugin.&lt;/p&gt;

&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;

&lt;p&gt;To follow this tutorial, you need:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;InfluxDB 3 Core or Enterprise with the Processing Engine enabled&lt;/li&gt;
  &lt;li&gt;InfluxDB 3 CLI installed and connected to the server&lt;/li&gt;
  &lt;li&gt;An authorization token with permission to create a database and triggers&lt;/li&gt;
  &lt;li&gt;Outbound access to GitHub so InfluxDB can load the official plugins referenced by gh: paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The examples assume a database named &lt;code class="language-markup"&gt;bird_demo&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 create database bird_demo&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you are using the local Docker environment that accompanies this article, InfluxDB is available at &lt;code class="language-markup"&gt;http://localhost:8181&lt;/code&gt;. InfluxDB 3 Explorer is available separately at &lt;code class="language-markup"&gt;http://localhost:8888&lt;/code&gt; for running the SQL and capturing visual results.&lt;/p&gt;

&lt;h4 id="generate-sample-telemetry-with-the-official-bird-simulator"&gt;Generate Sample Telemetry with the Official Bird Simulator&lt;/h4&gt;

&lt;p&gt;InfluxData’s &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/bird_data_simulator/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=downsampling_guide_influxdb_3&amp;amp;utm_content=blog"&gt;bird data simulator&lt;/a&gt; is a convenient fit for this tutorial. It creates repeatable time series behavior without requiring a separate data generator or hardware sensor.&lt;/p&gt;

&lt;p&gt;The plugin writes to the &lt;code class="language-markup"&gt;bird_tracking&lt;/code&gt; table. Its tags include species and name, and its fields include &lt;code class="language-markup"&gt;body_temp&lt;/code&gt;, &lt;code class="language-markup"&gt;longitude&lt;/code&gt;, &lt;code class="language-markup"&gt;latitude&lt;/code&gt;, &lt;code class="language-markup"&gt;speed&lt;/code&gt;, and &lt;code class="language-markup"&gt;heading&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First, install the plugin’s &lt;code class="language-markup"&gt;Faker&lt;/code&gt; dependency:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 install package Faker&lt;/code&gt;&lt;/pre&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 create trigger \
  --database bird_demo \
  --path gh:influxdata/bird_data_simulator/bird_data_simulator.py \
  --trigger-spec every:1s \
  --trigger-arguments bird_count=10 \
  bird_tracking_demo&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After the trigger has run for several seconds, confirm that data is arriving:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT *
FROM bird_tracking
ORDER BY time DESC
LIMIT 5;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;At one write per bird per second, the simulator produces approximately 600 rows per minute for 10 birds.&lt;/p&gt;

&lt;h4 id="downsample-at-query-time-with-sql"&gt;Downsample at Query Time with SQL&lt;/h4&gt;

&lt;p&gt;InfluxDB 3 SQL supports time bucketing with &lt;code class="language-markup"&gt;DATE_BIN()&lt;/code&gt;. The following query groups the raw bird readings into 10-second intervals and calculates speed and body-temperature statistics for each bird:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT
  DATE_BIN(INTERVAL '10 seconds', time) AS time,
  species,
  name,
  AVG(speed) AS avg_speed,
  MIN(speed) AS min_speed,
  MAX(speed) AS max_speed,
  AVG(body_temp) AS avg_body_temp,
  COUNT(*) AS record_count
FROM bird_tracking
WHERE time &amp;gt;= now() - INTERVAL '2 minutes'
GROUP BY 1, species, name
ORDER BY 1 DESC, species, name;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;DATE_BIN&lt;/code&gt; aligns each timestamp to a 10-second boundary. &lt;code class="language-markup"&gt;GROUP BY 1&lt;/code&gt; refers to the first expression in the &lt;code class="language-markup"&gt;SELECT&lt;/code&gt; list while &lt;code class="language-markup"&gt;species&lt;/code&gt; and &lt;code class="language-markup"&gt;name&lt;/code&gt; preserve one series per bird.&lt;/p&gt;

&lt;p&gt;This is true query-time downsampling: the server returns fewer, summarized rows, but it does not write them to another table. Change the interval or aggregates whenever the question changes. For example, a long-range dashboard might replace &lt;code class="language-markup"&gt;INTERVAL '10 seconds'&lt;/code&gt; with &lt;code class="language-markup"&gt;INTERVAL '1 hour'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Always include a bounded time predicate. It reduces the data scanned and makes the query’s intended resolution explicit.&lt;/p&gt;

&lt;h4 id="persist-downsampled-data-with-the-python-processing-engine"&gt;Persist Downsampled Data with the Python Processing Engine&lt;/h4&gt;

&lt;p&gt;For an aggregate that many users or dashboards repeatedly request, calculate it on a schedule with InfluxData’s official &lt;a href="https://docs.influxdata.com/influxdb3/core/plugins/library/official/downsampler/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=downsampling_guide_influxdb_3&amp;amp;utm_content=blog"&gt;downsampler plugin&lt;/a&gt;. The plugin queries the source table, computes aggregates, and writes the results to a target table.&lt;/p&gt;

&lt;p&gt;This trigger creates one average speed and body-temperature row per bird for every 10-second interval:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 create trigger \
  --database bird_demo \
  --path gh:influxdata/downsampler/downsampler.py \
  --trigger-spec every:10s \
  --trigger-arguments \
  'source_measurement=bird_tracking,target_measurement=bird_tracking_10s,interval=10s,window=2min,offset=10s,calculations=speed:avg.body_temp:avg,specific_fields=speed.body_temp' \
  bird_tracking_downsample&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The trigger arguments control the rollup:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;source_measurement&lt;/code&gt; is the raw source table.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;target_measurement&lt;/code&gt; is the table that receives aggregates&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;interval=10s&lt;/code&gt; defines the time-bin width.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;calculations&lt;/code&gt; assigns an aggregate function to each field&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;specific_fields&lt;/code&gt; limits processing to the fields needed by this rollup.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;offset=10s&lt;/code&gt; delays the queried window so its newest bin has time to close.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="why-the-offset-matters"&gt;Why the Offset Matters&lt;/h4&gt;

&lt;p&gt;The offset is not cosmetic. Without it, the simulator and downsampler could execute on the same 10-second scheduler boundary. Without an offset, the downsampler may query the newest bin while writes are still arriving, producing partial aggregates.&lt;/p&gt;

&lt;p&gt;With &lt;code class="language-markup"&gt;offset=10s&lt;/code&gt;, the preceding completed bin and every aggregate in the validation window should have the expected 10 source points. In production, set the offset to at least the maximum delay you expect between an event occurring and becoming queryable. Workloads with late or out-of-order data may need a larger offset and lookback window.&lt;/p&gt;

&lt;h4 id="inspect-the-persisted-result"&gt;Inspect the Persisted Result&lt;/h4&gt;

&lt;p&gt;The downsampler names calculated fields by appending the aggregate function, so &lt;code class="language-markup"&gt;speed&lt;/code&gt; becomes &lt;code class="language-markup"&gt;speed_avg&lt;/code&gt; and &lt;code class="language-markup"&gt;body_temp&lt;/code&gt; becomes &lt;code class="language-markup"&gt;body_temp_avg&lt;/code&gt;. It also writes &lt;code class="language-markup"&gt;record_count&lt;/code&gt;, &lt;code class="language-markup"&gt;time_from&lt;/code&gt;, and &lt;code class="language-markup"&gt;time_to&lt;/code&gt; metadata.&lt;/p&gt;

&lt;p&gt;The plugin stores the data with nanosecond precision and converts it with &lt;code class="language-markup"&gt;TO_TIMESTAMP_NANOS()&lt;/code&gt; when you want readable timestamps:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT
  time,
  species,
  name,
  ROUND(speed_avg, 2) AS avg_speed_mph,
  ROUND(body_temp_avg, 2) AS avg_body_temp_c,
  record_count,
  TO_TIMESTAMP_NANOS(time_from) AS source_start,
  TO_TIMESTAMP_NANOS(time_to) AS source_end
FROM bird_tracking_10s
ORDER BY time DESC, species, name
LIMIT 20;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="sample-output"&gt;Sample Output&lt;/h4&gt;

&lt;div class="blog-html-table-wrapper"&gt;
 &lt;table class="blog-html-table"&gt;
  &lt;thead&gt;
   &lt;tr&gt;
    &lt;th&gt;Time (UTC)&lt;/th&gt;
    &lt;th&gt;Species&lt;/th&gt;
    &lt;th&gt;Bird&lt;/th&gt;
    &lt;th&gt;Avg. speed&lt;/th&gt;
    &lt;th&gt;Avg. body temp.&lt;/th&gt;
    &lt;th&gt;Source points&lt;/th&gt;
    &lt;th&gt;Source start&lt;/th&gt;
   &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
   &lt;tr&gt;
    &lt;td&gt;2026-08-14 21:21:00&lt;/td&gt;
    &lt;td&gt;American Robin&lt;/td&gt;
    &lt;td&gt;Tracy&lt;/td&gt;
    &lt;td&gt;22.47&lt;/td&gt;
    &lt;td&gt;41.94&lt;/td&gt;
    &lt;td&gt;10&lt;/td&gt;
    &lt;td&gt;21:21:00&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;2026-08-14 21:21:00&lt;/td&gt;
    &lt;td&gt;Blue Jay&lt;/td&gt;
    &lt;td&gt;Sara&lt;/td&gt;
    &lt;td&gt;21.59&lt;/td&gt;
    &lt;td&gt;41.67&lt;/td&gt;
    &lt;td&gt;10&lt;/td&gt;
    &lt;td&gt;21:21:00&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;2026-08-14 21:21:00&lt;/td&gt;
    &lt;td&gt;Cactus Wren&lt;/td&gt;
    &lt;td&gt;Brandon&lt;/td&gt;
    &lt;td&gt;18.78&lt;/td&gt;
    &lt;td&gt;41.74&lt;/td&gt;
    &lt;td&gt;10&lt;/td&gt;
    &lt;td&gt;21:21:00&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;2026-08-14 21:21:00&lt;/td&gt;
    &lt;td&gt;Great Blue Heron&lt;/td&gt;
    &lt;td&gt;Brenda&lt;/td&gt;
    &lt;td&gt;6.38&lt;/td&gt;
    &lt;td&gt;41.10&lt;/td&gt;
    &lt;td&gt;10&lt;/td&gt;
    &lt;td&gt;21:21:00&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;2026-08-14 21:21:00&lt;/td&gt;
    &lt;td&gt;Great Blue Heron&lt;/td&gt;
    &lt;td&gt;Pamela&lt;/td&gt;
    &lt;td&gt;24.97&lt;/td&gt;
    &lt;td&gt;41.35&lt;/td&gt;
    &lt;td&gt;10&lt;/td&gt;
    &lt;td&gt;21:21:00&lt;/td&gt;
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/div&gt;

&lt;h4 id="validate-the-reduction-with-sql"&gt;Validate the Reduction with SQL&lt;/h4&gt;

&lt;p&gt;Do not judge a downsampling job only by whether the target table contains rows. Compare a fixed, completed interval so active writes cannot change the counts during validation.&lt;/p&gt;

&lt;p&gt;The following query compares two completed minutes of source data with the corresponding persisted rollups. &lt;strong&gt;Replace the timestamps with a completed interval from your own run&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;WITH raw AS (
  SELECT COUNT(*) AS raw_rows, COUNT(DISTINCT name) AS birds
  FROM bird_tracking
  WHERE time &amp;gt;= TIMESTAMP '2026-08-14T21:20:00Z'
    AND time " TIMESTAMP '2026-08-14T21:22:00Z'
),
downsampled AS (
  SELECT
    COUNT(*) AS downsampled_rows,
    SUM(record_count) AS represented_raw_rows,
    AVG(record_count) AS avg_points_per_row
  FROM bird_tracking_10s
  WHERE time &amp;gt;= TIMESTAMP '2026-08-14T21:20:00Z'
    AND time " TIMESTAMP '2026-08-14T21:22:00Z'
)
SELECT
  raw_rows,
  birds,
  downsampled_rows,
  represented_raw_rows,
  avg_points_per_row,
  ROUND(
    100.0 * (
      1.0 - CAST(downsampled_rows AS DOUBLE) / CAST(raw_rows AS DOUBLE)
    ),
    1
  ) AS row_reduction_percent
FROM raw CROSS JOIN downsampled;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="example-output"&gt;Example Output&lt;/h4&gt;

&lt;p&gt;The equality between &lt;code class="language-markup"&gt;raw_rows&lt;/code&gt; and &lt;code class="language-markup"&gt;represented_raw_rows&lt;/code&gt; is an important completeness check. The 90% figure is a reduction in rows for this query shape, not a promise of an identical reduction in bytes on disk. Actual storage depends on schema, tags, fields, compression, and retention settings.&lt;/p&gt;

&lt;p&gt;You should also compare aggregates against the query-time SQL version before applying any raw-data retention policy.&lt;/p&gt;

&lt;h2 id="downsampling-best-practices-for-production"&gt;Downsampling best practices for production&lt;/h2&gt;

&lt;p&gt;The tutorial uses short intervals so you can see results quickly. A production workload might keep second-level raw data briefly, create 5-minute summaries for operational dashboards, and return hourly summaries for long-term reporting.&lt;/p&gt;

&lt;p&gt;When designing that pipeline:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;window=2min&lt;/code&gt; gives each execution a lookback window large enough to reprocess recent data.&lt;/li&gt;
  &lt;li&gt;Start with the questions users need to answer, then choose the interval. A bin that is too wide can hide short-lived behavior.&lt;/li&gt;
  &lt;li&gt;Preserve the tags you need for filtering and grouping. Removing a dimension during aggregation cannot be reversed later.&lt;/li&gt;
  &lt;li&gt;Select aggregates that match the signal. Gauges often need average, minimum, and maximum; counters may need sums or rates.&lt;/li&gt;
  &lt;li&gt;Account for ingestion delay with &lt;code class="language-markup"&gt;offset&lt;/code&gt;, and use a lookback window that can catch expected late data.&lt;/li&gt;
  &lt;li&gt;Validate counts and values over multiple completed intervals before shortening raw-data retention.&lt;/li&gt;
  &lt;li&gt;Monitor the Processing Engine logs and query latency after deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="troubleshoot-a-scheduled-downsampler"&gt;Troubleshoot a scheduled downsampler&lt;/h2&gt;

&lt;p&gt;If the target table remains empty, inspect the Processing Engine logs:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT
  trigger_name,
  log_level,
  log_text,
  event_time
FROM system.processing_engine_logs
ORDER BY event_time DESC
LIMIT 20;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then check the most common causes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The source table or a field name does not match the trigger arguments.&lt;/li&gt;
  &lt;li&gt;The source does not contain data within the plugin’s window and offset.&lt;/li&gt;
  &lt;li&gt;A Python dependency required by a plugin has not been installed.&lt;/li&gt;
  &lt;li&gt;The server cannot retrieve a remote &lt;code class="language-markup"&gt;gh:&lt;/code&gt; plugin.&lt;/li&gt;
  &lt;li&gt;The selected aggregate is not valid for a field’s data type.&lt;/li&gt;
  &lt;li&gt;The newest interval is incomplete because the offset is too small.&lt;/li&gt;
  &lt;li&gt;Getting started with downsampling with InfluxDB 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;InfluxDB 3 makes it possible to use the same SQL aggregation logic at two stages of a workload: interactively at query time and operationally as a persisted rollup. Start with &lt;code class="language-markup"&gt;DATE_BIN&lt;/code&gt; to confirm the right interval and dimensions. When the query becomes a stable, repeated access pattern, schedule the official Python downsampler and include an offset so it works on completed data.&lt;/p&gt;

&lt;p&gt;Try the tutorial with &lt;a href="https://www.influxdata.com/influxdb-signup/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=downsampling_guide_influxdb_3&amp;amp;utm_content=blog"&gt;InfluxDB 3&lt;/a&gt; and the &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=downsampling_guide_influxdb_3&amp;amp;utm_content=blog"&gt;official InfluxDB 3 plugin library&lt;/a&gt;. Once your results match the raw source over a completed interval, adapt the interval, aggregates, offset, and retention strategy to your production workload.&lt;/p&gt;

&lt;h2 id="faqs"&gt;FAQs&lt;/h2&gt;

&lt;div id="accordion_second"&gt;
    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-1"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;What is downsampling?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-1" class="message-body is-collapsible is-active" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Downsampling is the process of grouping time series points into wider time intervals and calculating summaries such as averages, minimums, maximums, sums, or counts. InfluxDB 3 can calculate those summaries at query time with SQL or persist them with a Python Processing Engine.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-2"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;How do I downsample data with InfluxDB 3 SQL?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-2" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
              Use &lt;code class="language-markup"&gt;DATE_BIN&lt;/code&gt; to place timestamps into fixed intervals, apply aggregate functions such as &lt;code class="language-markup"&gt;AVG&lt;/code&gt; or &lt;code class="language-markup"&gt;MAX&lt;/code&gt;, and group by the binned time plus any tags you want to preserve. SQL downsampling returns aggregate rows but does not automatically write them to another table.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-3"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;When should I use the Python Processing Engine instead of SQL alone?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-3" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Use the Processing Engine when you want to precompute and store a rollup on a schedule. It is a good fit for aggregates used repeatedly by dashboards or long-range reports. Use query-time SQL when you need flexible intervals, are still exploring the data, or do not want another stored representation.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-4"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;How do I prevent partial downsampling windows?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-4" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Set the downsampler plugin’s `offset` so it queries intervals that have finished receiving data. The offset should cover normal ingestion latency and expected late arrivals. Validate completeness by comparing the sum of `record_count` in the aggregate table with the raw row count over the same closed interval.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-5"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Does downsampling delete the original data?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-5" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                No. Both a SQL aggregate query and the downsampler plugin leave the source data intact. The plugin writes additional rows to a target table. Raw-data deletion or expiration is controlled separately through retention settings.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-6"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;What does record_count mean in the downsampled table?.&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-6" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                `record_count` is the number of source records represented by an aggregate row. It is useful for detecting incomplete bins and for comparing the target table with the source over the same period.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-7"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Can I calculate more than one aggregate per interval?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-7" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Yes. A SQL query can return multiple functions such as AVG(speed), MIN(speed), and MAX(speed) in the same group. The official downsampler accepts calculation mappings for multiple fields. Choose only the summaries your queries need to avoid unnecessary write and storage overhead.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-8"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Does this approach work with InfluxDB 3 Cloud Serverless or Cloud Dedicated?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-8" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                The embedded Python Processing Engine workflow in this tutorial applies to InfluxDB 3 Core and Enterprise. For InfluxDB Cloud Serverless, follow the documented client-library downsampling pattern: query aggregates with SQL, write the results back, and schedule the client externally. For Cloud Dedicated, you can use the same general query-and-write pattern with an InfluxDB 3 client library and an external scheduler. 
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-9"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;How much storage will downsampling save?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-9" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                There is no universal percentage. The tutorial reduced the number of rows returned for its fixed test window by 90%, but byte-level storage depends on the schema, data types, tag cardinality, compression, the aggregates stored, and how long you retain each resolution.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

&lt;/div&gt;
</description>
      <pubDate>Wed, 19 Aug 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/downsampling-guide-influxdb-3/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/downsampling-guide-influxdb-3/</guid>
      <category>Developer</category>
      <author>Charles Mahler (InfluxData)</author>
    </item>
    <item>
      <title>A Rust Client for InfluxDB 3</title>
      <description>&lt;p&gt;Time series data shows up wherever the physical world meets software. A satellite constellation streams altitude, power, and thermal telemetry from every spacecraft on every pass. A factory floor running on Industry 4.0 principles instruments every line, every motor, every batch. And underneath all of it sits a humbler problem that anyone who has worked in operational technology knows well: getting telemetry out of the PLCs and edge controllers that actually run the machines, off the bus, and into a database that can enable real-time asset intelligence.&lt;/p&gt;

&lt;p&gt;InfluxDB 3 is built for this class of workload. It is the latest generation of the InfluxDB time series engine, built on an open source stack: &lt;strong&gt;Apache Arrow&lt;/strong&gt; for in-memory columnar data and &lt;strong&gt;Apache DataFusion&lt;/strong&gt; as the query engine. In practice, that means InfluxDB 3 is a columnar, vectorized engine that speaks SQL, exchanges data over Arrow Flight, and interoperates with the broader Arrow ecosystem, rather than a closed world with its own bespoke query path. For high-cardinality telemetry (thousands of spacecraft channels, tens of thousands of sensor tags on a plant floor), that columnar foundation is what keeps both ingest and analytical queries fast.&lt;/p&gt;

&lt;p&gt;What has been missing for Influx users is a first-class &lt;strong&gt;Rust&lt;/strong&gt; client. We just built one: &lt;a href="https://crates.io/crates/influxdb3-client/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=rust_client_influxdb_3&amp;amp;utm_content=blog"&gt;influxdb3-client&lt;/a&gt;, an async Rust client for InfluxDB 3 Core and Enterprise that mirrors the feature set of the official &lt;a href="https://github.com/InfluxCommunity/influxdb3-go/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=rust_client_influxdb_3&amp;amp;utm_content=blog"&gt;Go&lt;/a&gt; and &lt;a href="https://github.com/InfluxCommunity/influxdb3-python/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=rust_client_influxdb_3&amp;amp;utm_content=blog"&gt;Python&lt;/a&gt; clients with an idiomatic Rust API.&lt;/p&gt;

&lt;h2 id="why-rust-when-go-and-python-clients-already-exist"&gt;Why Rust, when Go and Python clients already exist?&lt;/h2&gt;

&lt;p&gt;The honest answer is that for a lot of jobs, you shouldn’t switch. If you’re exploring data in a notebook, the Python client is the right tool. If you’re writing a typical backend service, the Go client is mature and perfectly fast. Rust earns its place in the parts of a telemetry pipeline where the other two start to fight you. Here are some scenarios where it makes sense to switch:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The edge box next to the PLC&lt;/strong&gt;. The machine that bridges OPC UA or Modbus to your historian is often an ARM gateway with a few hundred MB of RAM, no package manager you control, and a change window measured in months. Rust cross-compiles to a single static binary, with no Python interpreter to install and patch on the box and no runtime to ship. &lt;code class="language-markup"&gt;scp&lt;/code&gt; it over, run it for a year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingest where tail latency is the spec&lt;/strong&gt;. During a ten-minute satellite pass, the ground segment has to drain every frame the downlink produces; there is no catching up later. A garbage collector that pauses at the wrong moment turns into dropped telemetry. Rust’s lack of a GC doesn’t make your code faster on average; it makes the worst case boring, which is what you actually care about when the data source won’t wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backpressure you can reason about&lt;/strong&gt;. High-rate ingest lives or dies on flow control: how many batches are in flight, how much memory they pin, what happens when the database slows down. With tokio, that’s an explicit semaphore and bounded buffers checked by the type system, rather than a goroutine count you tune by load testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The telemetry source is already Rust&lt;/strong&gt;. Increasingly, the code producing the telemetry is Rust: a ROS 2 node on an autonomous mobile robot, drone flight software, a soft-PLC runtime, or a protocol bridge that speaks OPC UA or MQTT-Sparkplug. When the producer is a Rust process, the historian client should be a library you embed in it: same binary, same async runtime, no sidecar process to deploy and monitor on every robot in the fleet. An &lt;code class="language-markup"&gt;Arc"Client"&lt;/code&gt; shared across your tokio tasks is the whole integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compile once, use anywhere&lt;/strong&gt;. The same binary often has to write to whatever InfluxDB the customer runs. As of 0.2, writes default to the V2 &lt;code class="language-markup"&gt;/api/v2/write&lt;/code&gt; endpoint, so one client works unchanged against InfluxDB 3 Core and Enterprise as well as InfluxDB Clustered and Cloud Dedicated/Serverless. A config flag, not a code change, opts into the V3-only extras like &lt;code class="language-markup"&gt;no_sync&lt;/code&gt; when you control the server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You’re already in the Arrow ecosystem&lt;/strong&gt;. InfluxDB 3 itself is written in Rust on Arrow and DataFusion. With this client, query results come back as native &lt;code class="language-markup"&gt;Arrow RecordBatch&lt;/code&gt;es—the same types you’d hand to DataFusion, Polars, or your own analytics code, with no serialization boundary in between. The client and the server are speaking the same in-memory format end-to-end.&lt;/p&gt;

&lt;p&gt;If none of these scenarios describe your situation, the Go and Python clients remain great choices. If one of them does, you should get familiar with the Rust client.&lt;/p&gt;

&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;

&lt;p&gt;The client is on &lt;a href="http://crates.io"&gt;crates.io&lt;/a&gt; and requires Rust 1.89 or later:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;cargo add influxdb3-client&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or add it to your &lt;code class="language-markup"&gt;Cargo.toml&lt;/code&gt; alongside an async runtime:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;[dependencies]
influxdb3-client = "0.2"
tokio = { version = "1", features = ["full"] }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is an optional &lt;code class="language-markup"&gt;polars&lt;/code&gt; feature for DataFrame-based workflows, which we’ll come back to later.&lt;/p&gt;

&lt;h4 id="let-claude-write-the-boilerplate"&gt;Let Claude Write the Boilerplate&lt;/h4&gt;

&lt;p&gt;If you use &lt;a href="https://claude.com/claude-code"&gt;Claude Code&lt;/a&gt;, there’s an &lt;strong&gt;influxdb3 skill&lt;/strong&gt; that teaches it the InfluxDB 3 API surface:  line protocol, the v3 SQL and InfluxQL query paths, token and database administration, and the client libraries—this one included. With the &lt;code class="language-markup"&gt;claude-influxdb3&lt;/code&gt; plugin installed, you can skip the docs-spelunking and ask things like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;*"Write me a Rust snippet that writes a batch of sensor readings to my InfluxDB 3 cluster and reads the last hour back with SQL."*
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You’ll get working code against this client’s actual API. It also knows the troubleshooting terrain: 401s from token scoping, line-protocol parse errors, and queries that silently return no rows. That’s most of what a first hour with any database consists of.&lt;/p&gt;

&lt;h2 id="configuring-a-client"&gt;Configuring a client&lt;/h2&gt;

&lt;p&gt;uuA client needs a host, a database, and (usually) an API token. This is the most explicit way is to build the configuration yourself:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use influxdb3_client::{Client, ClientConfig};

#[tokio::main]
async fn main() -&amp;gt; influxdb3_client::Result"()" {
    let client = Client::new(
        ClientConfig::builder()
            .host("http://localhost:8181")
            .token("my-api-token")
            .database("sensors")
            .build()?,
    )
    .await?;
    Ok(())
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For deployments where configuration comes from the environment, such as a container or a systemd unit on an edge box, read &lt;code class="language-markup"&gt;INFLUX_HOST&lt;/code&gt;, &lt;code class="language-markup"&gt;INFLUX_TOKEN&lt;/code&gt;, and &lt;code class="language-markup"&gt;INFLUX_DATABASE&lt;/code&gt; directly:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;let client = influxdb3_client::Client::from_env().await?;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Optional variables (&lt;code class="language-markup"&gt;INFLUX_AUTH_SCHEME&lt;/code&gt;, &lt;code class="language-markup"&gt;INFLUX_ORG&lt;/code&gt;, &lt;code class="language-markup"&gt;INFLUX_PRECISION&lt;/code&gt;, &lt;code class="language-markup"&gt;INFLUX_GZIP_THRESHOLD&lt;/code&gt;, and the &lt;code class="language-markup"&gt;INFLUX_WRITE_*&lt;/code&gt; family) configure the same write defaults the builder exposes, so a deployed agent can be retuned without a rebuild.&lt;/p&gt;

&lt;p&gt;Or, parse a single connection string, which is handy when configuration arrives as a single opaque value:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;"let client = influxdb3_client::Client::from_connection_string(
    "https://cluster.example.io/?token=TOKEN&amp;amp;database=mydb",
).await?;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The Arrow Flight channel used for queries is opened lazily on the first query, so constructing a client never blocks on query connectivity, and a write-only ingest agent never pays for a query connection it won’t use.&lt;/p&gt;

&lt;h2 id="writing-data"&gt;Writing data&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;client.write(data)&lt;/code&gt; returns a builder; chain the options you want, then &lt;code class="language-markup"&gt;.await&lt;/code&gt; it. The data argument is flexible—it can be a line-protocol string, a &lt;code class="language-markup"&gt;Vec"Point"&lt;/code&gt;, or (with the &lt;code class="language-markup"&gt;polars&lt;/code&gt; feature) a DataFrame.&lt;/p&gt;

&lt;h4 id="points"&gt;Points&lt;/h4&gt;

&lt;p&gt;The &lt;code class="language-markup"&gt;Point&lt;/code&gt; builder is the most ergonomic way to construct measurements in code:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use influxdb3_client::{Point, Precision};

let points = vec![
    Point::new("temperature")
        .tag("location", "office")
        .tag("floor", "2")
        .field("celsius", 22.5_f64)
        .field("humidity", 48_i64)
        .field("occupied", true),
];

client.write(points).precision(Precision::Millisecond).await?;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="raw-line-protocol"&gt;Raw Line Protocol&lt;/h4&gt;

&lt;p&gt;If you already have line protocol, say forwarded straight off a device, you can write it as is:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;client
    .write("cpu,host=server01 usage_user=42.3,usage_system=1.2")
    .await?;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="write-options"&gt;Write Options&lt;/h4&gt;

&lt;p&gt;The builder exposes the knobs that matter for real ingest pipelines:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;client.write(points)
    .precision(Precision::Nanosecond)
    .batch_size(10_000)          // points per HTTP request
    .max_inflight(8)             // concurrent in-flight requests
    .default_tag("region", "us-east")
    .tag_order(["region", "host"])
    .await?;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Large inputs are split into batches and sent as multiple pipelined requests, with one batch buffer held in memory at a time, so memory stays bounded even on very large writes.&lt;/p&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;tag_order&lt;/code&gt; matters more than it appears to. The &lt;strong&gt;first write defines the physical tag column order for a table, and that order&lt;/strong&gt; affects query performance; tags you filter on most should sort first. &lt;code class="language-markup"&gt;.tag_order(...)&lt;/code&gt; serializes the listed tags first, then appends any remaining tags in deterministic lexicographic order, so the machine that happens to boot first doesn’t accidentally pick a bad layout for everyone. (Background: &lt;a href="https://docs.influxdata.com/influxdb3/core/write-data/best-practices/optimize-writes/#sort-tags-by-query-priority"&gt;sort tags by query priority&lt;/a&gt;.)&lt;/p&gt;

&lt;h4 id="which-write-endpoint"&gt;Which Write Endpoint?&lt;/h4&gt;

&lt;p&gt;As of 0.2, writes go to the V2 &lt;code class="language-markup"&gt;/api/v2/write endpoint&lt;/code&gt; &lt;strong&gt;by default&lt;/strong&gt;, which means the same client also works against InfluxDB Clustered and InfluxDB Cloud Dedicated/Serverless without changes. Opting into the V3 endpoint (&lt;code class="language-markup"&gt;ClientConfig::builder().write_use_v2_api(false)&lt;/code&gt;, or &lt;code class="language-markup"&gt;INFLUX_WRITE_USE_V2_API=false&lt;/code&gt; in the environment) unlocks two V3-only behaviours: &lt;code class="language-markup"&gt;no_sync()&lt;/code&gt; (acknowledge before the WAL is synced) and partial-write reporting, both covered below.&lt;/p&gt;

&lt;h4 id="high-throughput-ingest"&gt;High-Throughput Ingest&lt;/h4&gt;

&lt;p&gt;For sustained, high-volume writes, such as a satellite pass or a full plant floor, the throughput levers are &lt;code class="language-markup"&gt;batch_size&lt;/code&gt; (points per request) and &lt;code class="language-markup"&gt;max_inflight&lt;/code&gt; (concurrent requests per call). On the V3 endpoint (&lt;code class="language-markup"&gt;write_use_v2_api(false)&lt;/code&gt;), &lt;code class="language-markup"&gt;no_sync()&lt;/code&gt; adds a third: acknowledge before the WAL is synced, trading a little durability for speed.&lt;/p&gt;

&lt;p&gt;A single &lt;code class="language-markup"&gt;write&lt;/code&gt; call serializes its batches on one task. To use more CPU cores and connections, run several &lt;code class="language-markup"&gt;write&lt;/code&gt; calls concurrently. A &lt;code class="language-markup"&gt;Client&lt;/code&gt; is cheap to share, and its HTTP connection pool is reused, so the idiomatic pattern is to wrap it in an &lt;code class="language-markup"&gt;Arc&lt;/code&gt;, spread chunks across tasks, and cap concurrency with a semaphore to keep in-flight buffers bounded:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use std::sync::Arc;
use tokio::sync::Semaphore;

let client = Arc::new(client);
// cap concurrent writes
let gate = Arc::new(Semaphore::new(8)); 

// each chunk is a Vec"Point"
for chunk in chunks {                    
    let permit = gate.clone().acquire_owned().await.unwrap();
    let client = Arc::clone(&amp;amp;client);
    tokio::spawn(async move {
        // released when the write completes
        let _permit = permit;            
        client
            .write(chunk)
            .batch_size(10_000)
            .max_inflight(8)
            .no_sync()

            .await
    });
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To spread load across multiple ingest nodes, put a load balancer in front of the cluster, or construct one &lt;code class="language-markup"&gt;Client&lt;/code&gt; per node and distribute chunks across them.&lt;/p&gt;

&lt;h2 id="querying-data"&gt;Querying data&lt;/h2&gt;
&lt;p&gt;InfluxDB 3 supports both &lt;strong&gt;SQL&lt;/strong&gt; and &lt;strong&gt;InfluxQL&lt;/strong&gt;, and the client exposes both through the same query-builder pattern: &lt;code class="language-markup"&gt;client.sql(q)&lt;/code&gt; or &lt;code class="language-markup"&gt;client.influxql(q)&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;let result = client
    .sql("SELECT * FROM temperature ORDER BY time DESC LIMIT 10")
    .await?;

for row in result {
    let row = row?;
    let loc = row["location"].as_str().unwrap_or("");
    let c = row["celsius"].as_f64().unwrap_or(0.0);
    println!("{loc}: {c}");
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;InfluxQL is called in exactly the same way, which makes it easy to bring existing InfluxQL queries forward:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;let result = client
    .influxql("SELECT MEAN(celsius) FROM temperature WHERE time &amp;gt; now() - 1h")
    .await?;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="parameterized-queries"&gt;Parameterized Queries&lt;/h4&gt;

&lt;p&gt;Bind parameters with &lt;code class="language-markup"&gt;.param()&lt;/code&gt; rather than interpolating into the query string:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;let rows = client
    .sql("SELECT COUNT(*) AS n FROM cpu WHERE host = $host")
    .param("host", "server01")
    .await?
    .rows()?;

if let Some(r) = rows.first() {
    println!("count: {}", r["n"]);
}&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="working-with-rows"&gt;Working with Rows&lt;/h4&gt;

&lt;p&gt;A &lt;code class="language-markup"&gt;QueryResult&lt;/code&gt; can be iterated row by row, collected all at once with &lt;code class="language-markup"&gt;.rows()&lt;/code&gt;, or accessed as raw Arrow &lt;code class="language-markup"&gt;RecordBatches&lt;/code&gt; with &lt;code class="language-markup"&gt;.record_batches()&lt;/code&gt; if you want to hand the columnar data straight to another Arrow-aware library. A &lt;code class="language-markup"&gt;Row&lt;/code&gt; is indexed by column name (&lt;code class="language-markup"&gt;row["col"]&lt;/code&gt;) or position (&lt;code class="language-markup"&gt;row[0]&lt;/code&gt;), and yields a Value with typed accessors: &lt;code class="language-markup"&gt;as_f64&lt;/code&gt;, &lt;code class="language-markup"&gt;as_i64&lt;/code&gt;, &lt;code class="language-markup"&gt;as_str&lt;/code&gt;, &lt;code class="language-markup"&gt;as_bool&lt;/code&gt;, &lt;code class="language-markup"&gt;is_null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One deliberate design choice: if a query returns an Arrow type the row API doesn’t support, you get an explicit &lt;code class="language-markup"&gt;Error::UnsupportedArrowType&lt;/code&gt;, rather than a silent null. Telemetry pipelines fail quietly often enough without the client library helping.&lt;/p&gt;

&lt;h4 id="streaming-large-results"&gt;Streaming Large Results&lt;/h4&gt;

&lt;p&gt;For analytical queries whose results are too large to hold in memory, like a scan over a month of high-rate telemetry, stream the Arrow batches instead of collecting them:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use futures_util::TryStreamExt;

let mut stream = client.sql("SELECT * FROM temperature").stream().await?;
while let Some(batch) = stream.try_next().await? {
    println!("got {} rows", batch.num_rows());
}&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="reliability"&gt;Reliability&lt;/h4&gt;

&lt;p&gt;Telemetry pipelines run unattended, so the client retries transient failures automatically with exponential backoff and full jitter. Connection errors, timeouts, &lt;code class="language-markup"&gt;429&lt;/code&gt;, and &lt;code class="language-markup"&gt;5xx&lt;/code&gt; responses are retried, and &lt;code class="language-markup"&gt;Retry-After&lt;/code&gt; is honored when present. Deterministic failures (other &lt;code class="language-markup"&gt;4xx&lt;/code&gt; responses and partial writes) are never retried. Retrying writes is safe because line-protocol writes are idempotent at the (&lt;code class="language-markup"&gt;series&lt;/code&gt;, &lt;code class="language-markup"&gt;timestamp&lt;/code&gt;, &lt;code class="language-markup"&gt;field&lt;/code&gt;) level, i.e., re-sending the same point simply overwrites it.&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use influxdb3_client::RetryConfig;
use std::time::Duration;

// Per-request override.
client.write(points)
    .retry(RetryConfig { max_retries: 5, base_delay: Duration::from_millis(100), ..RetryConfig::default() })
    .await?;

// Disable retries for a single call.
client.write(points).no_retry().await?;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On the V3 endpoint, when a batch contains invalid lines, the server accepts the valid ones and reports the rest, which surfaces as &lt;code class="language-markup"&gt;Error::PartialWrite&lt;/code&gt; with the rejected lines attached:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use influxdb3_client::Error;

if let Err(Error::PartialWrite(e)) = client.write(line_protocol).await {
    for line_error in &amp;amp;e.line_errors {
        eprintln!("line {}: {}", line_error.line, line_error.message);
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If all-or-nothing semantics fit your pipeline better, &lt;code class="language-markup"&gt;.accept_partial(false)&lt;/code&gt; rejects the entire batch when any line fails.&lt;/p&gt;

&lt;h2 id="polars-integration"&gt;Polars integration&lt;/h2&gt;

&lt;p&gt;For data-engineering and analysis workflows, the optional &lt;code class="language-markup"&gt;polars&lt;/code&gt; feature lets you write a DataFrame directly and read query results back as one:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3-client = { version = "0.2", features = ["polars"] }

use influxdb3_client::write_dataframe::DataFrameWrite;
use polars::prelude::*;&lt;/code&gt;&lt;/pre&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;let df = df![
    "host"    =&amp;gt; ["srv1", "srv2"],
    "region"  =&amp;gt; ["us-east", "us-west"],
    "cpu_pct" =&amp;gt; [42.5_f64, 71.0_f64],
    "time"    =&amp;gt; [1_700_000_000_000_000_000_i64, 1_700_000_001_000_000_000_i64],
]?;

client
    .write(
        DataFrameWrite::new(&amp;amp;df, "server_metrics")
            .tags(&amp;amp;["host", "region"])
            .timestamp_column("time"),
    )
    .await?;

let df_back = client
    .sql("SELECT * FROM server_metrics")
    .await?
    .to_polars()?;&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="backfilling-from-parquet-files"&gt;Backfilling from Parquet Files&lt;/h4&gt;

&lt;p&gt;Let’s look at a common migration task. Say you have historical telemetry sitting in Parquet files, exported from another system or batch dumped from a data lake, and you want it in InfluxDB where it can be queried alongside live data. File IO deliberately lives in your code rather than the client; read the file with Polars, then hand the frame to &lt;code class="language-markup"&gt;DataFrameWrite&lt;/code&gt;. Enable the Parquet reader on Polars in your own &lt;code class="language-markup"&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;polars = { version = "0.53", features = ["Parquet"] }&lt;/code&gt;&lt;/pre&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use std::fs::File;
use polars::prelude::*;
use influxdb3_client::write_dataframe::DataFrameWrite;

let df = ParquetReader::new(File::open("sensors.Parquet")?).finish()?;

client
    .write(
        DataFrameWrite::new(&amp;amp;df, "sensor_data")
            .tags(&amp;amp;["site", "line", "machine_id"])
            .timestamp_column("time"),
    )
    .await?;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Parquet files carry their schema, so dtypes arrive correct—floats stay floats, timestamps stay timestamps. Columns you name in &lt;code class="language-markup"&gt;.tags(&amp;amp;[...])&lt;/code&gt; become tags, the timestamp column sets each point’s time, and every remaining column becomes a field. The whole pipeline, from Parquet reader through DataFrame and client to server, is Arrow-native, so the data never leaves columnar form until the final encode.&lt;/p&gt;

&lt;p&gt;For a multi-gigabyte backfill, read and write in file-sized chunks rather than one giant frame, and reuse the high-throughput pattern from earlier (&lt;code class="language-markup"&gt;batch_size&lt;/code&gt;, &lt;code class="language-markup"&gt;max_inflight&lt;/code&gt;, one task per file) to keep the pipe full.&lt;/p&gt;

&lt;h4 id="loading-csv-exports"&gt;Loading CSV Exports&lt;/h4&gt;

&lt;p&gt;Most SCADA packages and historians will export CSV, so it’s often the format you’re handed. The same programming pattern works, with one caveat: CSV carries no schema, so Polars infers column types, and anything ambiguous infers as a &lt;strong&gt;string&lt;/strong&gt;. A string column becomes a string field in InfluxDB, and you can’t &lt;code class="language-markup"&gt;MEAN()&lt;/code&gt; a string. Supply the dtypes explicitly and parse the timestamp at read time:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;polars = { version = "0.53", features = ["csv"] }&lt;/code&gt;&lt;/pre&gt;

&lt;pre class=""&gt;&lt;code class="language-rust"&gt;use polars::prelude::*;
use influxdb3_client::write_dataframe::DataFrameWrite;

let schema = Schema::from_iter([
    Field::new("machine_id".into(), DataType::String),         
    Field::new("rpm".into(), DataType::Float64),                       Field::new("spindle_load_pct".into(), DataType::Float64),  
    Field::new("alarm_active".into(), DataType::Boolean),     
    Field::new("time".into(), DataType::Datetime(TimeUnit::Nanoseconds, None)),
]);

let df = CsvReadOptions::default()
    .with_schema(Some(Arc::new(schema)))
    .try_into_reader_with_file_path(Some("plc_export.csv".into()))?
    .finish()?;

client
    .write(
        DataFrameWrite::new(&amp;amp;df, "machine_telemetry")
            .tags(&amp;amp;["machine_id"])
            .timestamp_column("time"),
    )
    .await?;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you’d rather let inference do the first pass, that works too. Just &lt;code class="language-markup"&gt;cast()&lt;/code&gt; the numeric and boolean columns before writing, or they’ll land as string fields and you’ll be wondering why your aggregation queries return nothing.&lt;/p&gt;

&lt;h2 id="faq"&gt;FAQ&lt;/h2&gt;

&lt;div id="accordion_second"&gt;
    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-1"&gt;
            &lt;div class="message-header"&gt;
              &lt;h3&gt;What is &lt;code class="language-markup"&gt;influxdb3-client?&lt;/code&gt;&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-1" class="message-body is-collapsible is-active" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
              The Rust &lt;code class="language-markup"&gt;influxdb3-client&lt;/code&gt; is a Rust native client library for programmatically interacting with Influxdb. It simplifies writing Line Protocol (Influxdb’s native format) as well writing queries in SQL and Influxql.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-2"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;What Rust version does it require?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-2" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                The crate requires Rust version 1.89 or later.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-3"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Does it work with InfluxDB Cloud Dedicated, Clustered, or Serverless, or only Core and Enterprise?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-3" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Yes! The client library has a full backwards compatible api and integrates with any version of Influxdb that supports the v2 write API. 
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-4"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Does the client support InfluxDB 1.x or 2.x?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-4" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Yes. Later versions of InfluxDB have forward compatibility APIs, and all versions of Influxdb support the v2 write API. 
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-5"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Why would I use this instead of the Go or Python client?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-5" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                 Rust excels in embedded programing environments, or integrations with other Rust codebases. 
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-6"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Is the Polars integration required?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-6" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                No. Polars enables reading and writing to CSV and Parquet files, or if you want to leverage Polars Dataframes, but isn’t required. 
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-7"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Does it retry failed writes automatically?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-7" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Yes, the client retries transient failures automatically with exponential backoff and full jitter.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-8"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Where do I report issues or request features?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-8" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                https://github.com/InfluxCommunity/influxdb3-rust
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

&lt;/div&gt;

&lt;h2 id="try-it"&gt;Try it&lt;/h2&gt;

&lt;p&gt;The repository ships runnable examples in &lt;a href="https://github.com/InfluxCommunity/influxdb3-rust/tree/main/examples/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=rust_client_influxdb_3&amp;amp;utm_content=blog"&gt;examples/:&lt;/a&gt; a &lt;code class="language-markup"&gt;quickstart&lt;/code&gt; that does an end-to-end write and query, a Cloud Dedicated connection example, and a Polars DataFrame round-trip. Point them at a running InfluxDB 3 instance and go:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;INFLUX_HOST=http://localhost:8181 INFLUX_TOKEN=token INFLUX_DATABASE=mydb \
    cargo run --example quickstart&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The client is &lt;a href="https://crates.io/crates/influxdb3-client/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=rust_client_influxdb_3&amp;amp;utm_content=blog"&gt;influxdb3-client on crates.io&lt;/a&gt;, the source lives on &lt;a href="https://github.com/InfluxCommunity/influxdb3-rust/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=rust_client_influxdb_3&amp;amp;utm_content=blog"&gt;GitHub&lt;/a&gt;, and the API docs are on &lt;a href="https://docs.rs/influxdb3-client"&gt;docs.rs&lt;/a&gt;. It’s early, and feedback, issues, and pull requests are all welcome.&lt;/p&gt;
</description>
      <pubDate>Thu, 13 Aug 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/rust-client-influxdb-3/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/rust-client-influxdb-3/</guid>
      <category>Developer</category>
      <author>Ian Clark (InfluxData)</author>
    </item>
    <item>
      <title>Where Historians Fall Short for Physical AI</title>
      <description>&lt;p&gt;Physical AI enables machines and industrial systems to perceive conditions, reason about them, and act in the real world. In industrial settings, as part of an industrial AI strategy, physical AI models can help organizations identify risks earlier, optimize operations, and respond to changing conditions in real-time.&lt;/p&gt;

&lt;p&gt;Delivering these outcomes starts with training AI models on detailed historical operational data. Then, when deployed, these models need access to real-time telemetry to interpret current conditions, make decisions, and automate actions.&lt;/p&gt;

&lt;p&gt;For organizations built around traditional historians, supporting model training and real-time operations creates new challenges and new opportunities.&lt;/p&gt;

&lt;h2 id="where-historians-fall-short-for-physical-ai"&gt;Where historians fall short for Physical AI&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.influxdata.com/glossary/data-historian/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;Data historians&lt;/a&gt; remain essential systems for industrial operations. They create a durable record of process and equipment behavior, supporting engineering analysis, troubleshooting, reporting, auditability, and, where required, regulatory compliance.&lt;/p&gt;

&lt;p&gt;But the issue is, simply put, data historians were built for, well, historical data. The data requirements of Physical AI are different.&lt;/p&gt;

&lt;p&gt;At inference time, models need immediate access to current, sufficiently detailed operational data. During development and training, they need consistent, well-labeled history drawn from many operating conditions, assets, and sites. Historian-centered architectures can make both jobs difficult.&lt;/p&gt;

&lt;h4 id="retaining-operational-history-versus-a-live-model-feed"&gt;Retaining Operational History Versus a Live Model Feed&lt;/h4&gt;

&lt;p&gt;Data historians are effective at recording operations and helping engineers investigate what happened. But many historian deployments were not designed to continuously serve high-frequency OT data to AI models and applications operating across edge, IT, and cloud environments.
The data may be collected in real-time, yet still be difficult to use in real time. Historian data commonly remains inside the OT environment, where access is constrained by network segmentation, security requirements, proprietary interfaces, and site-specific infrastructure. Making it available to an AI application may require gateways, scheduled queries, replication, exports, or additional integration pipelines.&lt;/p&gt;

&lt;p&gt;Every additional step introduces operational complexity, and more importantly, delays. At inference time, latency matters. Physical AI systems must evaluate current conditions while there is still an opportunity to respond. If telemetry reaches the model after the equipment state or process condition has changed, the data may still support investigation, but it can no longer support timely intervention.&lt;/p&gt;

&lt;h4 id="compression-removes-relevant-signals-for-model-training"&gt;Compression Removes Relevant Signals for Model Training&lt;/h4&gt;

&lt;p&gt;Legacy data historians often use techniques such as (deadbands, exception processing, compression, aggregation, or downsampling, to reduce data volume while preserving operational trends. This approach is appropriate for traditional data historian workloads, e.g., reporting, troubleshooting, and compliance.&lt;/p&gt;

&lt;p&gt;By comparison, Physical AI models need to be trained on high-resolution telemetry that preserves the patterns required to recognize normal and abnormal operating states, predict outcomes, and determine the appropriate action. When those details are removed before training, models may not be able to learn the subtle behaviors that distinguish one condition from another.&lt;/p&gt;

&lt;h4 id="the-cost-of-fragmented-data"&gt;The Cost of Fragmented Data&lt;/h4&gt;

&lt;p&gt;Legacy data historian architectures were designed in an era when operational technology (OT) and information technology (IT) environments were largely separate. That separation creates challenges when training Physical AI models because much of the context needed to interpret telemetry, such as maintenance records, production schedules, quality results, operator actions, business processes, and asset relationships, resides in IT applications such as ERP, MES, and CMMS systems.&lt;/p&gt;

&lt;p&gt;In addition, historian architectures also tend to be site-centric. Historians are typically deployed and managed at the plant, facility, or asset level, creating separate stores of operational history across the organization. Physical AI initiatives may need data from multiple—or even all—sites to build an enterprise-level history that captures a broader range of assets, operating conditions, failures, and outcomes.&lt;/p&gt;

&lt;p&gt;Lastly, training datasets for Physical AI models are increasingly multimodal, combining telemetry with inputs such as images, video, audio, and LiDAR. When these sensory inputs are connected and aligned in time, models can learn how observations—across sight, sound, spatial awareness, and machine state—relate to operating conditions, how events unfold, and which outcomes or actions follow. This multimodal training prepares Physical AI models to interpret a wider range of sensory inputs at inference time, reason about current conditions, and ultimately act within the physical world.&lt;/p&gt;

&lt;p&gt;The challenge is that legacy historian architectures preserve time series telemetry as an operational record, but they do not inherently connect it with enterprise context, history from other sites, or data held in specialized multimodal systems.&lt;/p&gt;

&lt;p&gt;Bridging these &lt;a href="https://www.influxdata.com/blog/breaking-data-silos-influxdb-3/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;data silos&lt;/a&gt; requires building &lt;a href="https://www.influxdata.com/glossary/etl/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;ETL pipelines&lt;/a&gt;, custom integrations, and manual workflows to align timestamps, asset identities, operating conditions, events, and outcomes. Engineers spend significant time collecting, reconciling, and preparing data before it can be used to train Physical AI models.&lt;/p&gt;

&lt;table style="border-collapse: collapse; width: 100%; font-family: Arial, Helvetica, sans-serif; font-size: 16px; color: #000;"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style="background-color: #1A203F; color: #fff; text-align: left; padding: 16px 20px; border: 2px solid #000;"&gt;The Problem&lt;/th&gt;
      &lt;th style="background-color: #1A203F; color: #fff; text-align: left; padding: 16px 20px; border: 2px solid #000;"&gt;Historian Limitation&lt;/th&gt;
      &lt;th style="background-color: #1A203F; color: #fff; text-align: left; padding: 16px 20px; border: 2px solid #000;"&gt;InfluxDB 3 Solution&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Inference needs live data&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;OT data is trapped behind gateways and exports&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Ingests at the edge with low-latency queries&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Training needs full signal details&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Compression, downsampling, and aggregation strip patterns out&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Retain and serve full resolution data at scale&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;IT/OT connection&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Context lives outside the historian&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Connects telemetry with applications (ERP, MES, CMMS)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;AI needs data from every site&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Stores data on a per-site basis&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Consolidates multi-site data&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Models need to learn from more than sensor data&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Historians don't line up video, images, or audio with telemetry&lt;/td&gt;
      &lt;td style="padding: 16px 20px; border: 2px solid #000;"&gt;Syncs telemetry with other data types by time&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="a-modern-time-series-architecture-connects-edge-and-cloud"&gt;A modern time series architecture connects edge and cloud&lt;/h2&gt;

&lt;p&gt;Fortunately, teams don’t need to rip out their historians and toss them aside. With InfluxDB 3, organizations can build on existing historian investments while creating a more modern operational data architecture for Physical AI. Historians can continue to preserve the operational record, while InfluxDB provides a distributed time series data layer for ingesting, processing, consolidating, and distributing telemetry across edge, cloud, and enterprise environments.&lt;/p&gt;

&lt;p&gt;At the industrial edge, time series services can sit close to the source, where teams can process and query live telemetry for low-latency inference and action. Some or all of that data can also be sent to InfluxDB Cloud, creating a common, time-aligned data layer that brings together operational history from multiple sources. This gives organizations the detailed, connected historical datasets needed for model training, evaluation, and enterprise analysis.&lt;/p&gt;

&lt;p&gt;The cloud consolidation point also serves as a distribution layer. Telemetry can be made available without building a separate DataOps pipeline or custom integration between each source and every consumer. The same architecture can therefore support local decision-making at the edge and enterprise-wide learning in the cloud.&lt;/p&gt;

&lt;p&gt;Even better, this shared data layer can connect telemetry with asset metadata, data from enterprise systems such as ERP, MES, and CMMS, and multimodal data such as images, video, and audio. Time-aligned telemetry provides the operating context for these other data types, showing machine state, load, temperature, vibration, control settings, and process conditions at the moment a multimodal observation was captured or an operator action was taken. The result is a richer training foundation that helps Physical AI models learn not just what happened, but the conditions in which it happened, context that supports more accurate inference, stronger root-cause analysis, and better operational decisions.&lt;/p&gt;

&lt;h4 id="building-a-context-rich-training-dataset-for-physical-ai"&gt;Building a Context-Rich Training Dataset for Physical AI&lt;/h4&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/2uxMiXlnGroOl9O9rSk0VV/c60ef6fb5df45ea0e31b26f4d05eb187/8993186e-317e-4dbc-9557-69b60e31e46b.png" alt="Where Historians Fall Short for Physical AI diagram" /&gt;&lt;/p&gt;

&lt;h4 id="delivering-live-telemetry-to-ai-at-inference"&gt;Delivering Live Telemetry to AI at Inference&lt;/h4&gt;

&lt;p&gt;Built on &lt;a href="https://www.influxdata.com/glossary/apache-arrow/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;Apache Arrow &lt;/a&gt;and DataFusion with SQL support, InfluxDB 3 enables fast time series queries across large volumes of time-stamped data. It works alongside legacy historians as a real-time time series layer, or hub. Teams can ingest high-frequency telemetry, query recent data as it arrives, and use that data in dashboards, and to trigger alerts and automation workflows. With the &lt;a href="https://www.influxdata.com/blog/new-python-processing-engine-influxdb3/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;Python Processing Engine&lt;/a&gt;, teams can process signals, extract features, detect anomalies, and act on data as it arrives. This brings analysis closer to ingestion, helping deployed physical AI models run inference on current operating conditions and respond as they change.&lt;/p&gt;

&lt;h2 id="built-for-the-physical-world"&gt;Built for the physical world&lt;/h2&gt;

&lt;p&gt;Legacy data historians will continue to play an important role in preserving operational history and supporting long-term analysis. But as AI-driven operations become more common, organizations need additional capabilities to make detailed operational data continuously available for training, inference, and action.&lt;/p&gt;

&lt;p&gt;By extending historian investments with a modern, distributed time-series architecture, teams can support real-time action at the edge while consolidating and distributing operational data across the enterprise.&lt;/p&gt;

&lt;p&gt;Ready to build a stronger foundation for Physical AI? 
Explore InfluxDB 3 open source with &lt;a href="https://www.influxdata.com/products/influxdb/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;InfluxDB 3 Core&lt;/a&gt; or a free trial of &lt;a href="https://www.influxdata.com/products/influxdb-enterprise/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;InfluxDB 3 Enterprise&lt;/a&gt;. For more on this topic, watch the webinar, &lt;a href="https://www.influxdata.com/resources/physical-ai-for-industrial-iot-edge-impulse-influxdb/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=where_historians_fall_short&amp;amp;utm_content=blog"&gt;Physical AI for Industrial IoT: Edge Impulse + InfluxDB&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="faq"&gt;FAQ&lt;/h2&gt;
&lt;div id="accordion_second"&gt;
    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-1"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;What is Physical AI, and how does it differ from other forms of AI?
&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-1" class="message-body is-collapsible is-active" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Physical AI refers to AI systems that interact with the material world, interpreting telemetry through the lens of physical laws rather than just processing numbers or generating content. In industrial settings, it relies on continuous operational data such as sensor telemetry, machine states, and process conditions to interpret its environment and act in real-time.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-2"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;What's the difference between a data historian and a time series database?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-2" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                A data historian is built to record industrial process and equipment data for engineering analysis, troubleshooting, and compliance reporting. A time-series database, like InfluxDB 3, is purpose-built to ingest, query, and act on time series data in real-time across edge, cloud, and enterprise environment. Historians excel at retaining a historical record; time series databases are built to also serve that data live to applications and AI models.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-3"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Why can't traditional historians support real-time AI inference?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-3" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Many historian deployments store data inside OT environments where network segmentation, proprietary interfaces, and site-specific infrastructure limit real-time access. Getting that data to an AI model typically requires gateways, scheduled queries, or export pipelines, each of which adds latency. 
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-4"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;How does InfluxDB 3 help unify data across multiple industrial sites?
&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-4" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                Historians are typically deployed at the plant or facility level, creating separate stores of operational history. InfluxDB 3 can consolidate time series data from multiple sites into a centralized or cloud-based layer, giving Physical AI models an enterprise-wide dataset spanning more assets, operating conditions, and failure modes than any single site can provide alone.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

&lt;/div&gt;
</description>
      <pubDate>Tue, 04 Aug 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/where-historians-fall-short/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/where-historians-fall-short/</guid>
      <category>Developer</category>
      <author>Conrad Chuang (InfluxData)</author>
    </item>
    <item>
      <title>What’s New in InfluxDB 3.11: A Significant Performance Upgrade for Complex Time Series Workloads </title>
      <description>&lt;p&gt;Time series workloads rarely stay predictable for long. A system might begin with a few devices reporting a small set of measurements. As the fleet grows, new sensors come online, tags multiply, and query patterns change. A table that looked simple at the start becomes wide and sparse. A workload built around recent data expands into long-range analysis. As complexity grows, maintaining fast query performance and a predictable resource profile becomes much harder.&lt;/p&gt;

&lt;p&gt;InfluxDB 3.11 was built for that reality.&lt;/p&gt;

&lt;p&gt;Our last two releases gave users an early look at a set of performance improvements designed for heavier, more complex time series workloads. Today’s release of InfluxDB 3.11 makes those performance improvements GA in InfluxDB 3 Enterprise, bringing significantly faster queries on live data, greater flexibility for wide and ultra-sparse schemas, and more predictable performance under heavy load. The release also adds new Enterprise capabilities for backup and recovery, bulk data import, row-level deletes, and cluster operations.&lt;/p&gt;

&lt;h2 id="performance-and-flexibility-for-heavier-more-complex-workloads"&gt;Performance and flexibility for heavier, more complex workloads&lt;/h2&gt;

&lt;h4 id="faster-reads-for-single-series-workloads"&gt;Faster Reads for Single-Series Workloads&lt;/h4&gt;

&lt;p&gt;Time series applications rely on fast access to recent data, whether it’s the latest reading from a device, the current state of an asset, a narrow time range from a sensor, or a live view that tracks ingest. &lt;strong&gt;For highly selective queries, like those for a single time series, this new release of InfluxDB 3 Enterprise is up to 4x faster than previous versions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Actual performance will vary by workload, schema, hardware, and query shape. But for industrial monitoring, fleet management, observability, energy systems, and other applications built around live operational data, these gains mean faster access to the current state of the system.&lt;/p&gt;

&lt;h4 id="more-room-for-wide-sparse-and-changing-schemas"&gt;More Room for Wide, Sparse, and Changing Schemas&lt;/h4&gt;

&lt;p&gt;Time series data rarely arrives in one clean shape. As devices, sensors, tags, and operating environments change, schemas can become wide, sparse, and highly variable. Rigid schema limits can force teams to split data across more tables, drop useful context, or design around the database instead of the application.&lt;/p&gt;

&lt;p&gt;InfluxDB 3.11 expands schema flexibility with support for thousands of tables and millions of columns, while efficiently handling ultra-sparse datasets where only a small fraction of fields may be populated at any given time. Teams can model complex, changing telemetry around the data itself, with predictable query performance even as schemas grow wider and sparser.&lt;/p&gt;

&lt;p&gt;For customers moving from InfluxDB 1.x or 2.x to InfluxDB 3, this brings forward the schema flexibility they know from InfluxDB, now with the full SQL query engine, object-store-based durability, and unlimited cardinality.&lt;/p&gt;

&lt;h4 id="more-predictable-performance-under-load"&gt;More Predictable Performance Under Load&lt;/h4&gt;

&lt;p&gt;InfluxDB 3.11 reduces the resource spikes that can occur during heavy ingest and compaction. Memory usage is more predictable, and compaction runs with a more consistent resource profile, making it easier to understand what a workload actually requires.&lt;/p&gt;

&lt;p&gt;Teams can size infrastructure with more confidence instead of holding extra capacity for occasional spikes. Query responsiveness stays steadier under load, while memory and infrastructure costs are easier to plan for as workloads grow.&lt;/p&gt;

&lt;h2 id="new-data-management-capabilities-for-enterprise"&gt;New data management capabilities for Enterprise&lt;/h2&gt;

&lt;p&gt;InfluxDB 3.11 also adds new Enterprise capabilities for backing up, importing, and deleting data:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;End-to-End Backup &amp;amp; Restore&lt;/strong&gt;: You can now run full or incremental backups to capture compacted data. Restores run asynchronously, providing disaster recovery and allowing you to roll a live cluster back to an earlier point in time.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Bulk Import from Parquet&lt;/strong&gt;: Bringing existing or external data into InfluxDB 3 is now much simpler. A new bulk-import feature lets you upload an entire directory of Parquet files to ingest the data directly.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Row-Level Deletes&lt;/strong&gt;: Deleting individual rows is inherently more complex in columnar storage where data is optimized to be written and read in larger blocks. InfluxDB 3.11 now lets you target specific data by time range or tag predicate, without having to drop an entire table.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="influxdb-3-explorer-ui-now-built-in"&gt;InfluxDB 3 Explorer UI, now built in&lt;/h2&gt;

&lt;p&gt;InfluxDB 3.11 brings the Explorer UI directly into InfluxDB 3, giving users a visual interface for querying, exploring, and managing their data out of the box.&lt;/p&gt;

&lt;p&gt;Explorer goes well beyond basic data visualization. You can query data using SQL, InfluxQL, or natural language, convert existing Flux queries to SQL with AI-assisted explanations, and manage Processing Engine plugins from the built-in plugin manager. Explorer also includes schema browsing, sample data generation, visualization, and live instance monitoring in one interface.&lt;/p&gt;

&lt;h2 id="get-started-with-influxdb-311"&gt;Get started with InfluxDB 3.11&lt;/h2&gt;

&lt;p&gt;InfluxDB 3.11 brings the performance improvements introduced in our last two releases to GA, with faster single-series queries, support for wide and ultra-sparse schemas, and more predictable performance under load. New Enterprise data management capabilities and the built-in Explorer UI make these improvements easier to deploy and manage in production.&lt;/p&gt;

&lt;p&gt;As time series workloads grow, so do demands on the database. InfluxDB 3.11 is built to maintain performance as complexity increases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.influxdata.com/downloads/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-11&amp;amp;utm_content=blog"&gt;Download the latest version&lt;/a&gt; of InfluxDB 3 Core or Enterprise, pull the newest Docker image, or check out the docs (&lt;a href="https://docs.influxdata.com/influxdb3/core/release-notes/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-11&amp;amp;utm_content=blog"&gt;Core&lt;/a&gt;, &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/release-notes/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-11&amp;amp;utm_content=blog"&gt;Enterprise&lt;/a&gt;) to get started.&lt;/p&gt;
</description>
      <pubDate>Thu, 30 Jul 2026 07:30:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/influxdb-3-11/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/influxdb-3-11/</guid>
      <category>Product</category>
      <category>Developer</category>
      <category>news</category>
      <author>Peter Barnett (InfluxData)</author>
    </item>
    <item>
      <title>AI-Powered Spacecraft Operations with InfluxDB 3</title>
      <description>&lt;p&gt;When a satellite is drifting toward a fault, operators don’t need another dashboard full of disconnected charts. They need to know what changed, what it means, and what to check before the next ground pass closes. That’s the idea behind our &lt;a href="https://www.influxdata.com/solutions/by-industries/satellite-telemetry-monitoring/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;satellite telemetry&lt;/a&gt; demo: a live mission-control experience built on &lt;a href="https://www.influxdata.com/products/influxdb/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;InfluxDB 3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The demo monitors a simulated fleet of 12 satellites, continuously ingesting telemetry such as onboard computer temperature, battery voltage, solar current, reaction wheel RPM, power draw, RF link margin, ground station, orbit pass, and attitude status. One satellite is actively degrading, while historical incidents provide useful context for comparison.&lt;/p&gt;

&lt;p&gt;You can check out the live demo &lt;a href="https://www.influxdata.com/demos/satellite-demo/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;here&lt;/a&gt; or watch the video to see it in action:&lt;/p&gt;

&lt;div class="youtube-container"&gt;
  &lt;iframe class="responsive-iframe" src="https://www.youtube.com/embed/G20XWaESNjk?si=C4bjYRbucMsyVttr" title="Real-Time Satellite Monitoring with InfluxDB 3 &amp;amp; Claude" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""&gt;
  &lt;/iframe&gt;
&lt;/div&gt;

&lt;h2 id="demo-overview"&gt;Demo overview&lt;/h2&gt;

&lt;h4 id="from-telemetry-stream-to-operator-signal"&gt;From Telemetry Stream to Operator Signal&lt;/h4&gt;

&lt;p&gt;The main dashboard provides a fleet overview showing which satellites are online, which are currently in contact, and where anomalies are occurring. Operators can then drill into individual spacecraft to get a more specific view and look at historical data.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/7Hnc2hAafjqsncgkQWS8eS/d84f83fd4ff1284ada15b36a79720489/c6c08772-315c-43b5-89b8-45e4ebf0aa86.png" alt="AI-Powered Spacecraft Operations with InfluxDB 3 #1" /&gt;&lt;/p&gt;

&lt;h4 id="detecting-anomalies-as-data-arrives"&gt;Detecting Anomalies as Data Arrives&lt;/h4&gt;

&lt;p&gt;Behind the scenes, the &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;InfluxDB 3 Processing Engin&lt;/a&gt;e observes incoming data as it is written to the database and automatically creates alerts based on conditional thresholds or sensor states.&lt;/p&gt;

&lt;p&gt;That means anomaly detection happens without waiting for a separate pipeline to catch up. Another processing engine task incorporates NOAA data for environmental context alongside vehicle behavior.&lt;/p&gt;

&lt;p&gt;This pattern can be extended beyond satellites. Any connected system with high-volume and time-sensitive data, such as industrial equipment, energy infrastructure, production systems, or logistics networks, will benefit.&lt;/p&gt;

&lt;h4 id="accessing-operational-truth-using-ai"&gt;Accessing Operational Truth Using AI&lt;/h4&gt;

&lt;p&gt;This demo also includes an AI agent powered by the &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/admin/mcp-server/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;InfluxDB 3 MCP server&lt;/a&gt;. Instead of generating answers based on generic knowledge, the agent can access data stored in InfluxDB. You can ask about fleet health, a specific satellite, or the root cause of a suspected issue. The agent can then query InfluxDB throughout a conversation and summarize what it found.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/2PBcQAMHMzcDTGf2NnK5yY/ae6cc4af4ce194aead3e22739d3cc6a2/34b36852-d14e-403a-99f9-4b3151bf1893.png" alt="AI-Powered Spacecraft Operations with InfluxDB 3 #2" /&gt;&lt;/p&gt;

&lt;h2 id="under-the-hood-from-raw-telemetry-to-operational-context"&gt;Under the hood: From raw telemetry to operational context&lt;/h2&gt;

&lt;p&gt;This demo goes beyond the dashboard; it illustrates how InfluxDB 3 can transform live data into enriched operational data without external tools, as well as how to integrate InfluxDB into LLM-powered workflows.&lt;/p&gt;

&lt;h4 id="alerting-on-real-time-data"&gt;Alerting on Real-Time Data&lt;/h4&gt;

&lt;p&gt;Each incoming batch of satellite telemetry data triggers a processing engine plugin that evaluates data, such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Onboard computer temperature&lt;/li&gt;
  &lt;li&gt;Reaction wheel RPMs&lt;/li&gt;
  &lt;li&gt;Power draw&lt;/li&gt;
  &lt;li&gt;Attitude status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an anomaly is found, an alert is written to a separate InfluxDB table. The row contains all relevant information for managing an incident, both in the short term and for historical tracking. Instead of the AI agent burning tokens querying and searching raw telemetry, it works from a dedicated alert stream that preserves the signal behind the alert.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/43el1jBplLhRWvsGw5f6Sa/3527873b6deeea2f88aef524f882a88a/1a54ebbd-6fa3-4427-9315-df8624cd8135.png" alt="AI-Powered Spacecraft Operations with InfluxDB 3 #3" /&gt;&lt;/p&gt;

&lt;h4 id="enriching-telemetry-with-third-party-data"&gt;Enriching Telemetry with Third Party Data&lt;/h4&gt;

&lt;p&gt;Another way the demo uses the Processing Engine collecting NOAA planetary Kp index data with an external API call. This data is then stored in InfluxDB where operators can analyze how satellites are being impacted by external conditions and surface any correlated relationship between them.&lt;/p&gt;

&lt;p&gt;Scheduled Processing Engine jobs help enrich operational data. Depending on your use case, this could include weather, energy prices, traffic, or financial market data. It can also calculate rollups, forecast, or downsample data at a scheduled interval.&lt;/p&gt;

&lt;h4 id="integrated-ai-agent-using-the-influxdb-3-mcp-server"&gt;Integrated AI Agent Using the InfluxDB 3 MCP Server&lt;/h4&gt;

&lt;p&gt;The AI agent is connected to InfluxDB via the MCP server. Rather than relying on a static prompt or blindly summarizing a dashboard, it can query recent telemetry and alerts, inspect the result, and explain its conclusion.&lt;/p&gt;

&lt;p&gt;The UI exposes that query/tool trace so operators can see what evidence informed the answer. The agent effectively becomes an interface to your data model.&lt;/p&gt;

&lt;h2 id="putting-the-processing-engine-to-work"&gt;Putting the processing engine to work&lt;/h2&gt;

&lt;p&gt;InfluxDB 3’s Processing Engine runs Python inside the database and supports triggers on data writes, schedules, and HTTP requests. That allows it to do far more than simple threshold alerts. You can check the &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;documentation&lt;/a&gt; for more detail on the three trigger types and how plugins can retain state between executions.&lt;/p&gt;

&lt;p&gt;Here are a few interesting ways you can take advantage of the Processing Engine:&lt;/p&gt;

&lt;div class="blog-html-table-wrapper"&gt;
 &lt;table class="blog-html-table"&gt;
  &lt;thead&gt;
   &lt;tr&gt;
    &lt;th&gt;Trigger type&lt;/th&gt;
    &lt;th&gt;Use case&lt;/th&gt;
    &lt;th&gt;Outcome&lt;/th&gt;
   &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
   &lt;tr&gt;
    &lt;td&gt;On write&lt;/td&gt;
    &lt;td&gt;Stateful anomaly detection&lt;/td&gt;
    &lt;td&gt;Detect drift against a rolling baseline, not just a static threshold.&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;On write&lt;/td&gt;
    &lt;td&gt;Schema validation and enrichment&lt;/td&gt;
    &lt;td&gt;Reject or flag malformed data; add additional metadata.&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;On write&lt;/td&gt;
    &lt;td&gt;Alert routing&lt;/td&gt;
    &lt;td&gt;Write an alert record and then kick off an incident management workflow with related context.&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;Scheduled&lt;/td&gt;
    &lt;td&gt;Deadman check&lt;/td&gt;
    &lt;td&gt;Identify data sources that have stopped writing data.&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;Scheduled&lt;/td&gt;
    &lt;td&gt;Forecasting and error evaluation&lt;/td&gt;
    &lt;td&gt;Generate expected readings, compare them to actual behavior, and detect changes before a hard limit is crossed.&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;Scheduled&lt;/td&gt;
    &lt;td&gt;Data lifecycle&lt;/td&gt;
    &lt;td&gt;Downsample or export selected data.&lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td&gt;HTTP request&lt;/td&gt;
    &lt;td&gt;Operational runbooks&lt;/td&gt;
    &lt;td&gt;Expose an API endpoint that an app can use to retrieve data or start a workflow.&lt;/td&gt;
   &lt;/tr&gt;
  &lt;/tbody&gt;
 &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;If you don’t want to start from scratch building with the Processing Engine, there are a number of &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/library/official/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;plugins built and supported by the InfluxDB team&lt;/a&gt;. Some plugin examples:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Anomaly detection&lt;/li&gt;
  &lt;li&gt;Schema validation&lt;/li&gt;
  &lt;li&gt;Notifications&lt;/li&gt;
  &lt;li&gt;Iceberg export&lt;/li&gt;
  &lt;li&gt;Integrations for Kafka, MQTT, and AMQP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bigger opportunity is to compose these pieces. You could ingest data, validate it on write, detect drift against a baseline, write a contextual alert, enrich it with scheduled external data, and let an MCP-enabled AI agent explain the event in plain language.&lt;/p&gt;

&lt;h2 id="check-out-the-demo-and-start-building"&gt;Check out the demo and start building&lt;/h2&gt;

&lt;p&gt;While this demo is built specifically for satellites, the architecture is designed for any use case where &lt;a href="https://www.influxdata.com/what-is-time-series-data/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;time series data&lt;/a&gt; is used to take action and direct important decisions.&lt;/p&gt;

&lt;p&gt;InfluxDB 3 stores the live signal. The Processing Engine detects, enriches, and routes meaningful events. The MCP server gives an AI agent a grounded way to investigate the data and show its work. Together, they turn telemetry from data teams merely collect into something they can understand and act on.&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.influxdata.com/demos/satellite-demo/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;Satellite Telemetry demo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.influxdata.com/products/signup/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;Download InfluxDB 3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://docs.influxdata.com/influxdb3/explorer/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;InfluxDB 3 Explorer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://docs.influxdata.com/influxdb3/enterprise/admin/mcp-server/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;InfluxDB 3 MCP Server&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/library/official/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=ai-powered-spacecraft-ops&amp;amp;utm_content=blog"&gt;InfluxDB 3 official processing engine plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="faqs"&gt;FAQs&lt;/h2&gt;

&lt;div id="accordion_second"&gt;
    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-1"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;How does the demo detect anomalies in real-time?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-1" class="message-body is-collapsible is-active" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
                The InfluxDB 3 processing Engine watches incoming data as it is written and automatically generates alerts based on conditional thresholds or sensor states. This removes the need for a separate processing pipeline.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-2"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;What is the InfluxDB 3 Processing Engine and what can it do beyond alerting? &lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-2" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
               The Processing Engine allows InfluxDB 3 to run custom Python code inside your database. This code can be activated by three different trigger types: data writes, schedules, or via HTTP request. Beyond threshold alerts, it can be used for schema validation, deadman checks, downsampling, data transformation, and many other use cases.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-3"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;How can InfluxDB be used with an AI agent?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-3" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
               This demo uses the InfluxDB MCP server to connect to an AI agent, giving the LLM context directly from InfluxDB to answer questions about the current state of the satellite fleet. InfluxDB also has a CLI and REST API that can be utilized by AI agents.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-4"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;Is this demo specific to satellites or can the architecture be reused elsewhere?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-4" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
              The architecture is designed for any use case built on time series data that is used to drive decisions. It could be used for monitoring industrial equipment, energy infrastructure, or logistics networks. The same combination of InfluxDB for storage, Processing Engine for anomaly detection and enrichment, and MCP for AI-powered investigation generalizes for all of these use cases.
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

    &lt;article class="message"&gt;
        &lt;a href="javascript:void(0)" data-action="collapse" data-target="collapsible-message-accordion-second-5"&gt;
            &lt;div class="message-header"&gt;
                &lt;h3&gt;What is InfluxDB 3?&lt;/h3&gt;
                &lt;span class="icon"&gt;
                    &lt;i class="fas fa-angle-down" aria-hidden="true"&gt;&lt;/i&gt;
                &lt;/span&gt;
            &lt;/div&gt;&lt;/a&gt;
        &lt;div id="collapsible-message-accordion-second-5" class="message-body is-collapsible" data-parent="accordion_second" data-allow-multiple="true"&gt;
            &lt;div class="message-body-content"&gt;
               InfluxDB 3 is a time series database used to store and analyze time series data for high performance workloads. It has a built-in Python VM for low latency data analysis and an MCP server for integration with AI agents.

            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/article&gt;

&lt;/div&gt;
</description>
      <pubDate>Wed, 29 Jul 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/ai-powered-spacecraft-ops/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/ai-powered-spacecraft-ops/</guid>
      <category>Developer</category>
      <author>Charles Mahler (InfluxData)</author>
    </item>
    <item>
      <title>What’s New in InfluxDB 3: 5 New Processing Engine Plugins</title>
      <description>&lt;p&gt;The InfluxDB team has released five new Processing Engine plugins. They range from making it easy to call a hosted ML model to pulling in stock market data in real-time. Every one of them can be activated with a few terminal commands. No external services or tools—they all run inside your existing InfluxDB instance.&lt;/p&gt;

&lt;p&gt;Here’s what’s new, when you’d reach for them, and a few quickstart examples to get you going in minutes.&lt;/p&gt;

&lt;h2 id="processing-engine-primer"&gt;Processing Engine primer&lt;/h2&gt;

&lt;p&gt;If you aren’t familiar, the &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;Processing Engine&lt;/a&gt; is an embedded Python runtime inside InfluxDB 3 that allows you to execute Python code on the following triggers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Schedule&lt;/strong&gt; - Run code at scheduled intervals&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Data write&lt;/strong&gt; - Runs whenever data is written to a table&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Request&lt;/strong&gt; - A custom HTTP endpoint that handles incoming requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plugins can query InfluxDB, transform your data, and write it back to a new table. They can also be used to hit external services outside InfluxDB.&lt;/p&gt;

&lt;h2 id="sagemaker-inference"&gt;SageMaker inference&lt;/h2&gt;

&lt;p&gt;The SageMaker plugin pulls rows of data, formats them how your SageMaker model expects, calls the model endpoint, and writes the prediction back to InfluxDB. It can build CSVs or 8 different JSON schema options, so it supports TensorFlow Serving, AWS’ built-in algorithms, and Hugging Face models.&lt;/p&gt;

&lt;p&gt;This plugin allows you to use your deployed SageMaker models without having to create a custom plugin. Just point the plugin at your endpoint to get anomaly scores, classifications, forecasts, or whatever else your endpoint returns, and have it written directly to InfluxDB.&lt;/p&gt;

&lt;h4 id="example-anomaly-scoring-with-built-in-aws-model"&gt;Example: Anomaly Scoring with Built-In AWS Model&lt;/h4&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 install package boto3
influxdb3 install package pandas

influxdb3 create trigger \
  --database iot \
  --path "sagemaker.py" \
  --trigger-spec "every:30s" \
  --trigger-arguments 'endpoint_name=rcf-anomaly,source_measurement=metrics,feature_order={cpu}|{mem}|{rps}|{p99_ms},json_shape=instances_features,output_fields=anomaly_score=scores[*].score,interval=2min,limit=20' \
  rcf_score&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With this setup, every 30 seconds the last 20 rows of metrics will get batched into a request to your Random Cut Forest endpoint. Each score comes back as a new row in the specified output table.&lt;/p&gt;

&lt;h2 id="value-counter"&gt;Value counter&lt;/h2&gt;

&lt;p&gt;This plugin is a port of the Telegraf value counter aggregator plugin. Point it at a field, and it will count how many times each unique value shows up in your data. It can be used with a data write trigger that counts as rows arrive or a scheduled trigger that aggregates the time window since it last ran. Common use cases for this plugin are HTTP status codes or log-level counts.&lt;/p&gt;

&lt;h2 id="chronos-forecasting"&gt;Chronos forecasting&lt;/h2&gt;

&lt;p&gt;The Chronos forecasting plugin allows you to use Amazon’s Chronos time series foundation models directly against your InfluxDB data. Chronos models don’t require a training step; you point the plugin at a measurement, and it returns a median forecast and prediction interval between 50% and 80%. This plugin works as a scheduled trigger for recurring forecasts and as an HTTP trigger for on-demand forecasting.&lt;/p&gt;

&lt;p&gt;The benefit of using Chronos models is that you don’t need to mess around with training data or tuning per series. If you want to start getting forecasts on your data as soon as possible, this is the fastest path.&lt;/p&gt;

&lt;h4 id="example-on-demand-forecast-via-http"&gt;Example: On-Demand Forecast via HTTP&lt;/h4&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 install package chronos-forecasting
influxdb3 install package torch

influxdb3 create trigger \
  --database mydb \
  --path chronos_forecasting.py \
  --trigger-spec "request:forecast_series" \
  chronos_forecast_http

influxdb3 enable trigger --database mydb chronos_forecast_http

curl -X POST "http://localhost:8181/api/v3/engine/forecast_series" \
  -H "Content-Type: application/json" \
  -d '{"table": "sensor_data", "field": "temperature", "horizon": 28, "context_limit": 128}'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will return your historical context and a 28-step forecast, with each point having a median value and 50%-80% confidence bounds.&lt;/p&gt;

&lt;h2 id="simple-data-replicator"&gt;Simple data replicator&lt;/h2&gt;

&lt;p&gt;This plugin replicates data from your local InfluxDB 3 instance to a remote instance over HTTP, with built-in table/field filtering and renaming. It can be run on a schedule or on every data write. Data is buffered in a queue with automatic retries to support unreliable network connectivity.&lt;/p&gt;

&lt;p&gt;The data replicator makes it easier to set up edge-to-cloud deployments, sync dev and staging environments, or deploy InfluxDB in multiple regions.&lt;/p&gt;

&lt;h5 id="example-replicate-data-on-every-write"&gt;Example: Replicate Data on Every Write&lt;/h5&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 install package influxdb3-python

influxdb3 create trigger \
  --database mydb \
  --trigger-spec "all_tables" \
  --plugin-filename gh:influxdata/simple_data_replicator/simple_data_replicator.py \
  --trigger-arguments host=example.com,remote_token=apiv3_token,database=remote_db,tables="home home2",unique_file_suffix=wxyz5678 \
  simple_data_replicator_trigger

influxdb3 enable trigger --database mydb simple_data_replicator_trigger&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="stock-portfolio-tracker"&gt;Stock portfolio tracker&lt;/h2&gt;

&lt;p&gt;With the stock portfolio tracker plugin, you can fetch live stock prices from Yahoo Finance. Define the tickers you want to track in a TOML configuration file and monitor values over time. This plugin is mostly an example of how versatile the Processing Engine is, showing how you can make external API calls, aggregate data on a schedule, and roll up your data.&lt;/p&gt;

&lt;h2 id="mix-and-match-your-plugins"&gt;Mix and match your plugins&lt;/h2&gt;

&lt;p&gt;These five plugins are just some of the most recent &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/library/official/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;created by the InfluxDB team&lt;/a&gt;. The official plugin library already has plugins for data transformation, downsampling, anomaly detection, alerting, and more. The biggest benefit of the Processing Engine is the ability to combine these out-of-the box tools. Here is some inspiration:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;SageMaker Inference + &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/library/official/notifier/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;Notifier&lt;/a&gt;&lt;/strong&gt; - SageMaker writes anomaly scores to InfluxDB as time series data. You can then use the Notifier plugin to send alerts to Slack, email, or a webhook if a threshold is crossed without needing a separate alert stack.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Value Counter + &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/library/official/state-change/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;State Change&lt;/a&gt;&lt;/strong&gt; - If you are tracking the status of something, you can use the value counter to tell you how many times a value has appeared and combine it with the state change to tell you when it changed. Together you can track frequency counts and status-change events for alerting, giving you a complementary view of the same data.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Simple data replicator + Downsampler&lt;/strong&gt; - Downsampling your data locally before sending it to your remote InfluxDB instance will help to reduce bandwidth usage.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Simple data replicator + InfluxDB to Iceberg&lt;/strong&gt; - This combination allows you to move hot data from InfluxDB to another instance for redundancy or regional access, and then export cold data to Iceberg for long-term storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All five are live now in the &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;influxdb3_plugins repository&lt;/a&gt;. Grab one, wire up a trigger, and see what you can build with the InfluxDB 3 Processing Engine.&lt;/p&gt;

&lt;h2 id="related-resources"&gt;Related resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.influxdata.com/influxdb-signup/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;InfluxDB 3 download&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;Official plugins Github repo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://docs.influxdata.com/influxdb3/enterprise/plugins/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;Processing Engine docs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://docs.influxdata.com/influxdb3/explorer/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=5_new_processing_engine_plugins&amp;amp;utm_content=blog"&gt;InfluxDB 3 Explorer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="faqs"&gt;FAQs&lt;/h2&gt;

&lt;h5 id="q-do-i-need-to-write-python-to-use-these-plugins"&gt;&lt;strong&gt;Q: Do I need to write Python to use these plugins?&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;No, each plugin is ready to run after you install its dependencies with &lt;code class="language-markup"&gt;influxdb3 install package&lt;/code&gt;, then wire it up with &lt;code class="language-markup"&gt;influxdb3 create trigger&lt;/code&gt;. You only need to touch Python if you want to modify the plugin’s behavior or create a custom plugin.&lt;/p&gt;

&lt;h5 id="q-do-i-need-to-write-python-to-use-these-plugins-1"&gt;Q: Do I need to write Python to use these plugins?&lt;/h5&gt;
&lt;p&gt;No, each plugin is ready to run after you install its dependencies with &lt;code class="language-markup"&gt;influxdb3 install package&lt;/code&gt;, then wire it up with &lt;code class="language-markup"&gt;influxdb3 create trigger&lt;/code&gt;. You only need to touch Python if you want to modify the plugin’s behavior or create a custom plugin.&lt;/p&gt;

&lt;h5 id="q-can-i-configure-a-plugin-with-a-file-instead-of-inline-commands"&gt;Q: Can I configure a plugin with a file instead of inline commands?&lt;/h5&gt;
&lt;p&gt;Yes, every plugin supports using a TOML configuration file via the &lt;code class="language-markup"&gt;config_file_path&lt;/code&gt; argument. Using a configuration file is recommended for setups that require more than a few parameters.&lt;/p&gt;

&lt;h5 id="q-where-do-i-see-plugin-errors-or-logs"&gt;Q: Where do I see plugin errors or logs?&lt;/h5&gt;
&lt;p&gt;Every plugin writes to the &lt;code class="language-markup"&gt;system.processing_engine_logs&lt;/code&gt; table in the trigger’s database.&lt;/p&gt;

&lt;h5 id="q-do-these-plugins-work-with-all-versions-of-influxdb-3"&gt;Q: Do these plugins work with all versions of InfluxDB 3?&lt;/h5&gt;
&lt;p&gt;All five run on both InfluxDB 3 Core and InfluxDB 3 Enterprise; you just need the Processing Engine enabled (&lt;code class="language-markup"&gt;--plugin-dir /path/to/plugins&lt;/code&gt; when you start the server).&lt;/p&gt;
</description>
      <pubDate>Thu, 23 Jul 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/5-new-processing-engine-plugins/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/5-new-processing-engine-plugins/</guid>
      <category>Developer</category>
      <author>Charles Mahler (InfluxData)</author>
    </item>
    <item>
      <title>Telegraf 1.39 Release Notes</title>
      <description>&lt;p&gt;A new feature-bearing release for Telegraf is now available:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Telegraf 1.39 — &lt;a href="https://docs.influxdata.com/telegraf/v1/release-notes/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;Release notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find the binaries for the latest Telegraf release on our Downloads page. Many thanks to all the open source community members who contributed to this effort!&lt;/p&gt;

&lt;h2 id="new-plugins"&gt;New plugins&lt;/h2&gt;

&lt;p&gt;These are the newest plugins, first available in this version:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;GNMI dial-out input&lt;/strong&gt; (&lt;code class="language-markup"&gt;inputs.gnmi_listener&lt;/code&gt;)
    &lt;ul&gt;
      &lt;li&gt;Receive GNMI dial-out telemetry data pushed by network equipment such as Nokia SR OS devices.&lt;/li&gt;
      &lt;li&gt;Please open a &lt;a href="https://github.com/influxdata/telegraf/issues/new?template=FEATURE_REQUEST.yml/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;feature request&lt;/a&gt; to request support for your devices.&lt;/li&gt;
      &lt;li&gt;Contributed by &lt;a href="https://github.com/srebhan/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;srebhan&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="important-changes"&gt;Important changes&lt;/h2&gt;

&lt;p&gt;Here are some changes to highlight:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;OPCUA node discovery&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;The OPCUA input plugins, both &lt;code class="language-markup"&gt;inputs.opcua&lt;/code&gt; and &lt;code class="language-markup"&gt;inputs.opcua_listener&lt;/code&gt;, can now be configured to discover nodes based on filtering patterns. This allows Telegraf to work in dynamic environments where nodes are added or removed on the server side.&lt;/li&gt;
      &lt;li&gt;If configured, the plugin will browse available nodes on the server and filter them according to your settings. It will then subscribe or listen to the remaining nodes to create metrics.&lt;/li&gt;
      &lt;li&gt;Use the &lt;code class="language-markup"&gt;browse&lt;/code&gt; settings to specify the root node and depth for the nodes to discover and one or more &lt;code class="language-markup"&gt;browse.paths&lt;/code&gt; patterns to filter the nodes found.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Oracle SQL driver support&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Use the &lt;code class="language-markup"&gt;outputs.sql&lt;/code&gt; plugin to stream metrics to Oracle databases.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Custom header support for Kafka&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;Set custom record headers for messages sent by &lt;code class="language-markup"&gt;outputs.kafka&lt;/code&gt;. The header values support templating, taking the metrics sent as input.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;MongoDB custom metadata&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Set custom metadata in &lt;code class="language-markup"&gt;outputs.mongodb&lt;/code&gt; for the MongoDB documents written by specifying a tag subset. This allows easier and more efficient querying while keeping the full metric information.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;OpenTelemetry improvements&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;The &lt;code class="language-markup"&gt;outputs.opentelemetry&lt;/code&gt; plugin now allows using a proxy or authenticating with a token.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;More system details&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;The &lt;code class="language-markup"&gt;inputs.system&lt;/code&gt; plugin provides more details on the host system, such as DMI hardware and operating system information.&lt;/li&gt;
      &lt;li&gt;To include this information, please opt in by adding the respective &lt;code&gt;include&lt;/code&gt; settings in your configuration.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="downloads"&gt;Downloads&lt;/h2&gt;

&lt;p&gt;Head to our &lt;a href="https://portal.influxdata.com/downloads/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;Downloads page&lt;/a&gt; to get the latest Telegraf release. If you have issues or questions, please join our &lt;a href="https://influxdata.com/slack/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;InfluxDB Community Slack&lt;/a&gt; or post them in our &lt;a href="https://github.com/influxdata/telegraf/issues/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;InfluxDB GitHub Repo&lt;/a&gt; or &lt;a href="https://community.influxdata.com/c/influxdb2/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;Community Site&lt;/a&gt;, and we will look into them.&lt;/p&gt;

&lt;h2 id="influxdb-university"&gt;InfluxDB University&lt;/h2&gt;

&lt;p&gt;Learn more about collecting data with Telegraf by taking the free InfluxDB University &lt;a href="https://university.influxdata.com/courses/data-collection-with-telegraf-tutorial/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf_1_39_release_notes_influxdb&amp;amp;utm_content=blog"&gt;Data Collection with Telegraf course&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Fri, 10 Jul 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/telegraf-1-39-release-notes-influxdb/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/telegraf-1-39-release-notes-influxdb/</guid>
      <category>Developer</category>
      <author>Sven Rebhan (InfluxData)</author>
    </item>
    <item>
      <title>What's New in InfluxDB and Telegraf: Q2 2026 Product Updates</title>
      <description>&lt;p&gt;Here’s everything that shipped.&lt;/p&gt;

&lt;h2 id="telegraf-enterprise-reaches-general-availability"&gt;Telegraf Enterprise reaches general availability&lt;/h2&gt;

&lt;p&gt;Telegraf is the open source standard for collecting telemetry from infrastructure, applications, and devices. But what happens at scale? An enterprise running thousands of agents doesn’t have one collection problem; it has thousands of slightly different configs, no single view of agent health, and no safe way to roll out changes with confidence. Today, that usually means leaning on Ansible, Puppet, Chef, or some homegrown script nobody fully trusts. We built Telegraf Enterprise to solve that.&lt;/p&gt;

&lt;p&gt;&lt;img class="pt-20 pb-40" src="//images.ctfassets.net/o7xu9whrs0u9/2XmbwzMu6YQN9Air4lWsNv/d7cd9e94d78ad0442a1be3b2a3d54953/InfluxData_Telegraf_Agents_dashboard.png" alt="InfluxData Telegraf Agents dashboard" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.influxdata.com/blog/telegraf-enterprise-ga/"&gt;Telegraf Enterprise&lt;/a&gt; reached general availability on June 24, 2026, giving teams a centralized way to manage, monitor, and support tens of thousands of Telegraf agents. It combines Telegraf Controller, a console for fleet management, with official InfluxData support. Open source Telegraf doesn’t change—teams get the same lightweight agent and 400+ official plugins. What changes is the operational layer above it: one place to see every agent’s health, standardize configurations, and roll out fleet-wide changes with confidence.&lt;/p&gt;

&lt;p&gt;For platform teams running telemetry across hundreds of environments, that visibility is the difference between reacting to problems and operating with control.&lt;/p&gt;

&lt;div class="telegraf-comparison-wrap"&gt;
  &lt;table class="telegraf-comparison"&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th style="width: 24%;"&gt;&amp;nbsp;&lt;/th&gt;
        &lt;th style="width: 36%;"&gt;Telegraf Controller (free)&lt;/th&gt;
        &lt;th style="width: 42%;"&gt;Telegraf Enterprise&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;Managed agents&lt;/td&gt;
        &lt;td&gt;Up to 100&lt;/td&gt;
        &lt;td&gt;Enterprise scale (10,000s of agents)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Configurations&lt;/td&gt;
        &lt;td&gt;Up to 20&lt;/td&gt;
        &lt;td&gt;Unlimited&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Audit logging&lt;/td&gt;
        &lt;td&gt;No&lt;/td&gt;
        &lt;td&gt;Yes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;LDAP/OIDC&lt;/td&gt;
        &lt;td&gt;No&lt;/td&gt;
        &lt;td&gt;Yes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Support&lt;/td&gt;
        &lt;td&gt;Community&lt;/td&gt;
        &lt;td&gt;Official support for Controller and Telegraf&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;The free tier is enough to evaluate Telegraf Controller. Telegraf Enterprise removes the ceiling, adds the audit trail and identity integrations that production environments need, and upgrades in place with no disruption or re-platforming.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.influxdata.com/products/telegraf-enterprise/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=telegraf-enterprise-ga&amp;amp;utm_content=blog&amp;amp;dl=telegraf-controller"&gt;Download Telegraf Controller&lt;/a&gt; or &lt;a href="https://www.influxdata.com/contact-sales-telegraf-enterprise/"&gt;contact us about Telegraf Enterprise&lt;/a&gt; to get started.&lt;/p&gt;

&lt;h2 id="influxdb-39-and-310-close-the-gap-before-production"&gt;InfluxDB 3.9 and 3.10 close the gap before production&lt;/h2&gt;

&lt;p&gt;Running a database at the center of your stack takes more than speed. It takes operational control: who can access it, how quickly you can recover, how easily access scales with your team, and how reliably it performs under heavy load. &lt;a href="https://www.influxdata.com/blog/influxdb-3-9/"&gt;InfluxDB 3.9&lt;/a&gt; and &lt;a href="https://www.influxdata.com/blog/influxdb-3-10/"&gt;InfluxDB 3.10&lt;/a&gt;, released June 17, 2026, deliver both. 3.9 strengthened day-to-day operations; 3.10 built on top of it, advancing the performance beta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;InfluxDB 3.9 focused on day-to-day operations&lt;/strong&gt;, the kind that matters once a database is someone’s responsibility, not just a tool they query. 3.9 came with&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;CLI:&lt;/strong&gt; new flags for headless automation and data validation&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Database lifecycle:&lt;/strong&gt; background resources like triggers now clean up properly on deletion&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Access control:&lt;/strong&gt; improved visibility across permissions and product identity for Core and Enterprise builds&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Performance beta&lt;/strong&gt; (opt-in, Enterprise): optimized single-series queries, smoother resource usage under heavy compaction or ingestion, wider and sparser schema support, and automatic distinct value caching to cut metadata query latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;InfluxDB 3.10 expanded the beta with enterprise features&lt;/strong&gt;. Most teams aren’t held up by the database engine itself when they’re ready to go live. The basics hold them up: can we back this up, can we delete what we’re not supposed to keep, can we control who has access to what. 3.10 closes those gaps, offering:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;End-to-end backup and restore&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Row-level deletes&lt;/strong&gt; by time range or tag predicate&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Bulk import&lt;/strong&gt; from Parquet files or directories&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Multi-user auth and RBAC&lt;/strong&gt; (preview): built-in Admin, Auditor, and Member roles with OAuth and OIDC support, no changes to existing token-based workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outside the beta, every InfluxDB 3 Enterprise deployment gets cross-database plugin queries, a new / &lt;code&gt;ready&lt;/code&gt; endpoint that checks object store connectivity before reporting healthy, and parallel compaction to keep query nodes current under heavy ingest.&lt;/p&gt;

&lt;p&gt;On the performance side, 3.10 improves query latency for single-series lookups, last-value fetches, and hot-data access, with a reduction in average query latency over prior InfluxDB 3 releases on workloads that hit those paths. Metadata queries like &lt;code&gt;SHOW TAG VALUES&lt;/code&gt; see the biggest jump, thanks to automatic distinct value caching. Results are workload-dependent, as always, but the direction is consistent: the trade-offs between scale, flexibility, and performance that real-time systems have to navigate are getting smaller, and the upgrade itself requires no migration and no architecture change.&lt;/p&gt;

&lt;h2 id="query-with-sql-influxql-or-flux-in-influxdb-3-explorer"&gt;Query with SQL, InfluxQL, or Flux in InfluxDB 3 Explorer&lt;/h2&gt;

&lt;p&gt;The Explorer UI started as a place to query data and ended up able to manage schema, move data in, stream it continuously, and speak whichever query language a team already runs.&lt;/p&gt;

&lt;p&gt;&lt;img class="pt-10 pb-40" src="//images.ctfassets.net/o7xu9whrs0u9/Vp1Rz6Y1y3LSn5iUTfcSz/09dfa942be7fc3dc1fa5119bfc6aa33b/InfluxData_Query_Data_dashboard.png" alt="InfluxData Query Data dashboard" /&gt;&lt;/p&gt;

&lt;p&gt;You can now create, inspect, and delete tables directly in Explorer—no API calls, no CLI—with just the UI, plus a guided import from any v1, v2, or v3 instance and a Transform Data section for renaming, converting, filtering, and downsampling on ingest.&lt;/p&gt;

&lt;p&gt;InfluxDB 3 Explorer also learned to keep data moving. MQTT, Kafka, and AMQP streams now wire directly into databases, two new Live Data plugins write continuously, and line protocol validates itself before a single row is written.&lt;/p&gt;

&lt;p&gt;The headline addition in InfluxDB 3 Explorer 1.9 is an AI-assisted &lt;strong&gt;Flux-to-SQL converter&lt;/strong&gt; that explains its own translations line by line, so migrating off Flux doesn’t mean rewriting every query by hand. Alongside it, &lt;strong&gt;InfluxQL became first-class&lt;/strong&gt; in the Data Explorer, schema commands, per-tag charts, so teams that came up on InfluxDB 1.x or 2.x don’t have to leave the UI to use the commands they already know.&lt;/p&gt;

&lt;p&gt;Teams keep the queries, data, and workflows they already rely on, and get there faster in InfluxDB 3.&lt;/p&gt;

&lt;h2 id="a-few-things-people-have-asked-us"&gt;A few things people have asked us&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What’s the real difference between free Telegraf Controller and Telegraf Enterprise?&lt;/strong&gt; Mostly limits and accountability. Free caps you at 100 agents and 20 configs with no audit trail. Enterprise removes the caps and adds the audit logging, LDAP/OIDC, and Enterprise Support that a real production fleet needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I have to migrate anything to get InfluxDB 3.10?&lt;/strong&gt; No. It’s a seamless upgrade for existing InfluxDB 3 Enterprise and Cloud Dedicated customers. No migration tooling, no architecture change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Explorer actually convert my Flux queries?&lt;/strong&gt; Yes, the Flux-to-SQL converter is available in beta. Paste in a Flux query and get back equivalent SQL, plus a line-by-line explanation of how it got there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is InfluxQL fully supported in InfluxDB 3 now?&lt;/strong&gt; As of Explorer 1.9, yes. It’s a first-class language in the Data Explorer alongside SQL, including the schema-exploration commands InfluxQL veterans rely on.&lt;/p&gt;

&lt;h2 id="looking-ahead"&gt;Looking ahead&lt;/h2&gt;

&lt;p&gt;Some of the most important work this quarter is still in progress. If you’re testing the performance beta or trying the Flux-to-SQL converter, we’d love to hear what’s working, what isn’t, and what you’d like to see next. That feedback plays a direct role in where we go from here.&lt;/p&gt;

&lt;style&gt;
  .telegraf-comparison-wrap {
    padding-bottom: 40px;
    padding-top: 10px;
  }
  .telegraf-comparison {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    overflow: hidden;
    border: 1px solid #e2e5ef!important;
    border-radius: 6px;
    color: #020a47;
    line-height: 1.35;
  }

  .telegraf-comparison th,
  .telegraf-comparison td {
    padding: 26px 28px;
    text-align: left;
    vertical-align: middle;
  }

  .telegraf-comparison th {
    background:#020a47;
    color: #ffffff!important;
    font-weight: 700;
    font-size: 18px;
  }

  .telegraf-comparison tbody td:first-child {
    font-weight: 700;
  }

  .telegraf-comparison tbody td:nth-child(3) {
    background: #f3f4f7;
  }

  .telegraf-comparison tr:last-child td {
    border-bottom: 0;
  }

  .telegraf-comparison th:last-child,
  .telegraf-comparison td:last-child {
    border-right: 0;
  }
&lt;/style&gt;

</description>
      <pubDate>Wed, 01 Jul 2026 06:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/whats-new-in-influxdb-telegraf-q2-2026-product-updates/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/whats-new-in-influxdb-telegraf-q2-2026-product-updates/</guid>
      <category>Product</category>
      <category>Developer</category>
      <author>Ryan Nelson (InfluxData)</author>
    </item>
    <item>
      <title> What's New in InfluxDB 3 Explorer 1.9: Flux-to-SQL Conversion, InfluxQL Support, and More</title>
      <description>&lt;p&gt;InfluxDB 3 Explorer 1.9 makes it easier to work with your existing queries. Whether you’re migrating Flux queries to SQL or you’ve been writing in InfluxQL for years, this release helps bring your existing queries forward instead of starting from scratch.&lt;/p&gt;

&lt;p&gt;For teams moving to v3 from earlier versions of InfluxDB, query migration is often one of the last major hurdles. Explorer 1.9 introduces an AI-assisted Flux-to-SQL converter to help automate that process, while also bringing InfluxQL directly into Explorer.&lt;/p&gt;

&lt;p&gt;On top of that, this release adds two new live sample data simulators, an improved plugin log viewer, search across every list page, and query error history.&lt;/p&gt;

&lt;h2 id="convert-flux-queries-to-sql"&gt;Convert Flux queries to SQL&lt;/h2&gt;

&lt;p&gt;InfluxDB 3 uses SQL and InfluxQL to query data, but many teams still have Flux queries powering dashboards and alerts they’d rather not rewrite by hand. &lt;strong&gt;The new Flux-to-SQL converter (beta) does that translation for you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You’ll find it as a new tab in the Data Explorer, right next to SQL and InfluxQL. Paste in a Flux query, click Convert to SQL, and Explorer returns the equivalent InfluxDB 3 SQL in a side-by-side Flux and SQL layout. The conversion is powered by Kapa.ai, the same AI assistant behind the Ask AI helper on our documentation site.&lt;/p&gt;

&lt;p&gt;Here’s a typical example. Take this Flux query that reads CPU idle and derives a “busy” percentage from it:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;from(bucket: "instance_monitoring")
  |&amp;gt; range(start: -1h)
  |&amp;gt; filter(fn: (r) =&amp;gt; r._measurement == "system_cpu")
  |&amp;gt; filter(fn: (r) =&amp;gt; r._field == "idle")
  |&amp;gt; map(fn: (r) =&amp;gt; ({r with busy: 100.0 - r._value}))&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Click Convert, and you get back SQL:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT
  time,
  100.0 - idle AS busy
FROM
  system_cpu
WHERE
  time &amp;gt;= now() - INTERVAL '1 hour'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It isn’t a black box, either. &lt;strong&gt;The tool explains each conversion, walking through the translation line by line&lt;/strong&gt;. The &lt;code class="language-markup"&gt;range()&lt;/code&gt; call becomes the &lt;code class="language-markup"&gt;WHERE&lt;/code&gt; time clause, the &lt;code class="language-markup"&gt;_measurement&lt;/code&gt; filter becomes the &lt;code class="language-markup"&gt;FROM&lt;/code&gt; table, and the &lt;code class="language-markup"&gt;_field&lt;/code&gt; filter narrows things to the idle field, which in InfluxDB 3 is just a native column (no &lt;code class="language-markup"&gt;pivot()&lt;/code&gt; needed). The Flux &lt;code class="language-markup"&gt;map()&lt;/code&gt; that computes busy turns into a plain expression in the &lt;code class="language-markup"&gt;SELECT&lt;/code&gt; list, &lt;code class="language-markup"&gt;100.0 - idle AS busy&lt;/code&gt;. The panel also flags a behavioral difference worth noting: Flux’s &lt;code class="language-markup"&gt;map()&lt;/code&gt; keeps every existing column, while the SQL selects only time and computed busy, so if you want the original &lt;code class="language-markup"&gt;idle&lt;/code&gt; alongside it, add it to the &lt;code class="language-markup"&gt;SELECT&lt;/code&gt; list or use &lt;code class="language-markup"&gt;SELECT *&lt;/code&gt;. When a database is selected, you can hit &lt;strong&gt;Run SQL Query&lt;/strong&gt; and execute the converted query right there.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One note: the converter is beta and AI-generated, so its output can vary. Review the converted SQL before running your queries, and use the thumbs-up and thumbs-down buttons under the explanation to help improve future conversions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/3zEaKHukhVMYDU6OJRwJ6w/71361757342fcbd4963a6f572b871aa8/explorer_1.9_1.png" alt="explorer 1.9:1" /&gt;&lt;/p&gt;

&lt;h2 id="influxql-comes-to-the-data-explorer"&gt;InfluxQL comes to the Data Explorer&lt;/h2&gt;

&lt;p&gt;Many InfluxDB users have years of InfluxQL muscle memory, dashboards, and tooling built around it. In Explorer 1.9, &lt;strong&gt;InfluxQL is now a first-class query language&lt;/strong&gt;. There’s an InfluxQL tab right beside SQL, you can run InfluxQL directly against your databases, save and load queries as InfluxQL, and view them in your query history alongside SQL. This matters because some things are simply more natural in InfluxQL. The schema-exploration commands are the clearest case: there’s no SQL equivalent for how InfluxQL asks a measurement which tag values it has. For example:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-influxql"&gt;SHOW TAG VALUES FROM "bird_tracking" WITH KEY = "species"&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That returns the distinct species in the table as a tidy key/value list. The same goes for &lt;code class="language-markup"&gt;SHOW MEASUREMENTS&lt;/code&gt;, &lt;code class="language-markup"&gt;SHOW TAG KEYS&lt;/code&gt;, and &lt;code class="language-markup"&gt;SHOW FIELD KEYS&lt;/code&gt;, along with time series idioms like &lt;code class="language-markup"&gt;GROUP BY time(5m) fill(previous)&lt;/code&gt; that don’t have a one-to-one SQL counterpart. If those are part of how you work, you no longer have to leave Explorer to use them.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/1D7oSg5uCb899evUGWaIZe/a4e706cf202746092f237bbfbad5eddc/explorer_1.9_2.png" alt="explorer 1.9:2" /&gt;&lt;/p&gt;

&lt;h2 id="influxql-visualizations-with-per-tag-series"&gt;InfluxQL visualizations, with per-tag series&lt;/h2&gt;

&lt;p&gt;InfluxQL results aren’t stuck in a table either. You can render them as line and bar charts, and Explorer automatically groups series by tag. Take this query:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT mean("speed") FROM "bird_tracking"
WHERE time &amp;gt; now() - 1h
GROUP BY time(1m), "species" fill(none)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It produces one line per species, color-coded with a legend, exactly as you’d expect coming from earlier versions of InfluxDB. Group by a tag, get a series per tag value; switch between line and bar without rewriting anything.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/1B5tQuVnJwKMhYoEpXw0E4/a0aa3de95b7a1cac3b3989d8c51a8f21/explorer_1.9_3.png" alt="explorer 1.9:3" /&gt;&lt;/p&gt;

&lt;h2 id="two-new-live-sample-data-simulators"&gt;Two new live sample data simulators&lt;/h2&gt;

&lt;p&gt;In 1.8, we &lt;a href="https://www.influxdata.com/blog/explorer-1-8/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-explorer-1-9&amp;amp;utm_content=blog"&gt;added a Live Data tab&lt;/a&gt; to the Sample Data page, with Processing Engine plugins that continuously write data into a database on a schedule, so you have something moving to build dashboards and alerts against. 1.9 adds two more to the lineup, alongside the System Metrics Collector and US Weather Sampler.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/influxdata/influxdb3_plugins/blob/main/influxdata/bird_data_simulator/README.md/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-explorer-1-9&amp;amp;utm_content=blog"&gt;Bird Data Simulator&lt;/a&gt; generates synthetic bird telemetry: a persistent flock of named birds that move on each scheduled run with sinusoidal flight speed, drifting headings, and some temperature jitter. Each run writes to a bird_tracking measurement with species, name tags, and fields like speed, heading, latitude, and longitude. Because it’s naturally multi-series across many species, it pairs well with the per-tag InfluxQL charts above, and the only settings are volume controls, so it’s hard to misconfigure.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/1o9le2k1owhJQ49yoZYrd7/01bb8f35f2930216a84d4a99e7be1993/explorer_1.9_4.png" alt="explorer 1.9:4" /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/influxdata/influxdb3_plugins/blob/main/influxdata/signal_generator/README.md/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-explorer-1-9&amp;amp;utm_content=blog"&gt;Signal Generator&lt;/a&gt; is for when you want a clean, controllable signal instead of a realistic one. It produces composable waveforms (sine, square, triangle, sawtooth, noise, and spikes), and the default preset, a slow sine with light noise and occasional spikes, is immediately useful for testing alerts and anomaly detection. It fills gaps between runs so your data stays continuous, configurable, and reliant only on the Python standard library.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/19iAIWATtr2b7Eiekm5rcz/180063bd438eafde752cdb0f573c0f6e/explorer_1.9_5.png" alt="explorer 1.9:5" /&gt;&lt;/p&gt;

&lt;p&gt;As with the other live plugins, you’ll need InfluxDB 3 Core or Enterprise with the Processing Engine enabled.&lt;/p&gt;

&lt;h2 id="quality-of-life-improvements"&gt;Quality-of-life improvements&lt;/h2&gt;

&lt;p&gt;A release isn’t only headline features. A few smaller changes in 1.9 take some daily friction out of Explorer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A better plugin log viewer&lt;/strong&gt;. Logs now open in a dedicated viewer with line numbers and color-coded output, a search box for finding a specific message, level filters for &lt;strong&gt;Info&lt;/strong&gt;, &lt;strong&gt;Warn&lt;/strong&gt;, and &lt;strong&gt;Error&lt;/strong&gt;, and an Export button. Now you can filter straight to the errors, search for the exact message, and spot why a plugin misbehaved at a glance.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/32iPVl3ymn8Z7dv9JQ5VSi/faefd500181b7427156fcb84bec4cf50/explorer_1.9_6.png" alt="explorer 1.9:6" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search across every list page and a smarter database selector&lt;/strong&gt;. Manage Databases, Tables, Tokens, the Plugin Dashboard, and server configuration now have search boxes, so you can find an item by typing a few characters. The database selector is also an autocomplete picker that works the same everywhere it appears, which saves time once you have more than a handful of databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query error history&lt;/strong&gt;. The query History panel now has an &lt;strong&gt;Errors&lt;/strong&gt; tab next to your query history. Every failed query is captured with a timestamp, the query language, the database it ran against, the exact query text, and the full error message. So if a query fails, you can look back at precisely what went wrong instead of trying to reconstruct it.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/2w2CHICavBN2Pcsb5nw1jj/658dd91ecc5039426aa624f328e69038/explorer_1.9_7.png" alt="explorer 1.9:7" /&gt;&lt;/p&gt;

&lt;p&gt;The SQL editor also gets a &lt;strong&gt;Format&lt;/strong&gt; button that cleans up and reflows a query for readability, handy for pasted one-liners. And the plugins page gets a &lt;strong&gt;Run now&lt;/strong&gt; button, so you can trigger a plugin on demand instead of waiting for its next scheduled run, good for testing before you trust it to a schedule.&lt;/p&gt;

&lt;h2 id="try-explorer-19"&gt;Try Explorer 1.9&lt;/h2&gt;

&lt;p&gt;If you’ve been putting off migrating Flux or you’ve been missing InfluxQL in the Explorer UI, this release closes both gaps, and the new simulators give you continuously flowing data to try it all against. If you skipped the last post, &lt;a href="https://www.influxdata.com/blog/explorer-1-8/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-explorer-1-9&amp;amp;utm_content=blog"&gt;What’s New in InfluxDB 3 Explorer 1.8&lt;/a&gt; covers streaming subscriptions, smarter sample data, line protocol validation, and retention controls.&lt;/p&gt;

&lt;p&gt;To update InfluxDB 3 Explorer, pull the latest Docker image: &lt;code class="language-markup"&gt;docker pull influxdata/influxdb3-ui&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To learn more, check out the &lt;a href="https://docs.influxdata.com/influxdb3/explorer/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-explorer-1-9&amp;amp;utm_content=blog"&gt;InfluxDB 3 Explorer documentation&lt;/a&gt; and the &lt;a href="https://docs.influxdata.com/influxdb3/explorer/release-notes/?utm_source=website&amp;amp;utm_medium=direct&amp;amp;utm_campaign=influxdb-3-explorer-1-9&amp;amp;utm_content=blog"&gt;1.9 release notes&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Tue, 30 Jun 2026 07:30:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/influxdb-3-explorer-1-9/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/influxdb-3-explorer-1-9/</guid>
      <category>Product</category>
      <category>Developer</category>
      <author>Daniel Campbell (InfluxData)</author>
    </item>
  </channel>
</rss>
