The azure-native:iotoperations:DataflowProfile resource, part of the Pulumi Azure Native provider, defines a dataflow profile within an Azure IoT Operations instance: its processing capacity, placement, and observability settings. This guide focuses on two capabilities: instance count configuration for scaling and diagnostics setup for monitoring.
Dataflow profiles belong to an Azure IoT Operations instance and run on Arc-enabled Kubernetes clusters via custom locations. The examples are intentionally small. Combine them with your own IoT Operations instance, dataflow definitions, and endpoint configurations.
Create a minimal dataflow profile with single instance
Most deployments start with a single dataflow instance to handle data routing and transformation.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const dataflowProfile = new azure_native.iotoperations.DataflowProfile("dataflowProfile", {
dataflowProfileName: "aio-dataflowprofile",
extendedLocation: {
name: "qmbrfwcpwwhggszhrdjv",
type: azure_native.iotoperations.ExtendedLocationType.CustomLocation,
},
instanceName: "resource-name123",
properties: {
instanceCount: 1,
},
resourceGroupName: "rgiotoperations",
});
import pulumi
import pulumi_azure_native as azure_native
dataflow_profile = azure_native.iotoperations.DataflowProfile("dataflowProfile",
dataflow_profile_name="aio-dataflowprofile",
extended_location={
"name": "qmbrfwcpwwhggszhrdjv",
"type": azure_native.iotoperations.ExtendedLocationType.CUSTOM_LOCATION,
},
instance_name="resource-name123",
properties={
"instance_count": 1,
},
resource_group_name="rgiotoperations")
package main
import (
iotoperations "github.com/pulumi/pulumi-azure-native-sdk/iotoperations/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := iotoperations.NewDataflowProfile(ctx, "dataflowProfile", &iotoperations.DataflowProfileArgs{
DataflowProfileName: pulumi.String("aio-dataflowprofile"),
ExtendedLocation: &iotoperations.ExtendedLocationArgs{
Name: pulumi.String("qmbrfwcpwwhggszhrdjv"),
Type: pulumi.String(iotoperations.ExtendedLocationTypeCustomLocation),
},
InstanceName: pulumi.String("resource-name123"),
Properties: &iotoperations.DataflowProfilePropertiesArgs{
InstanceCount: pulumi.Int(1),
},
ResourceGroupName: pulumi.String("rgiotoperations"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var dataflowProfile = new AzureNative.IoTOperations.DataflowProfile("dataflowProfile", new()
{
DataflowProfileName = "aio-dataflowprofile",
ExtendedLocation = new AzureNative.IoTOperations.Inputs.ExtendedLocationArgs
{
Name = "qmbrfwcpwwhggszhrdjv",
Type = AzureNative.IoTOperations.ExtendedLocationType.CustomLocation,
},
InstanceName = "resource-name123",
Properties = new AzureNative.IoTOperations.Inputs.DataflowProfilePropertiesArgs
{
InstanceCount = 1,
},
ResourceGroupName = "rgiotoperations",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.iotoperations.DataflowProfile;
import com.pulumi.azurenative.iotoperations.DataflowProfileArgs;
import com.pulumi.azurenative.iotoperations.inputs.ExtendedLocationArgs;
import com.pulumi.azurenative.iotoperations.inputs.DataflowProfilePropertiesArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var dataflowProfile = new DataflowProfile("dataflowProfile", DataflowProfileArgs.builder()
.dataflowProfileName("aio-dataflowprofile")
.extendedLocation(ExtendedLocationArgs.builder()
.name("qmbrfwcpwwhggszhrdjv")
.type("CustomLocation")
.build())
.instanceName("resource-name123")
.properties(DataflowProfilePropertiesArgs.builder()
.instanceCount(1)
.build())
.resourceGroupName("rgiotoperations")
.build());
}
}
resources:
dataflowProfile:
type: azure-native:iotoperations:DataflowProfile
properties:
dataflowProfileName: aio-dataflowprofile
extendedLocation:
name: qmbrfwcpwwhggszhrdjv
type: CustomLocation
instanceName: resource-name123
properties:
instanceCount: 1
resourceGroupName: rgiotoperations
The instanceCount property controls how many parallel processing units run your dataflows. The extendedLocation property places the profile on a specific Arc-enabled Kubernetes cluster via its custom location. The instanceName ties this profile to your IoT Operations instance.
Scale to multiple dataflow instances
As data volume grows, increase the instance count to distribute workload across parallel processing units.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const dataflowProfile = new azure_native.iotoperations.DataflowProfile("dataflowProfile", {
dataflowProfileName: "aio-dataflowprofile",
extendedLocation: {
name: "qmbrfwcpwwhggszhrdjv",
type: azure_native.iotoperations.ExtendedLocationType.CustomLocation,
},
instanceName: "resource-name123",
properties: {
instanceCount: 3,
},
resourceGroupName: "rgiotoperations",
});
import pulumi
import pulumi_azure_native as azure_native
dataflow_profile = azure_native.iotoperations.DataflowProfile("dataflowProfile",
dataflow_profile_name="aio-dataflowprofile",
extended_location={
"name": "qmbrfwcpwwhggszhrdjv",
"type": azure_native.iotoperations.ExtendedLocationType.CUSTOM_LOCATION,
},
instance_name="resource-name123",
properties={
"instance_count": 3,
},
resource_group_name="rgiotoperations")
package main
import (
iotoperations "github.com/pulumi/pulumi-azure-native-sdk/iotoperations/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := iotoperations.NewDataflowProfile(ctx, "dataflowProfile", &iotoperations.DataflowProfileArgs{
DataflowProfileName: pulumi.String("aio-dataflowprofile"),
ExtendedLocation: &iotoperations.ExtendedLocationArgs{
Name: pulumi.String("qmbrfwcpwwhggszhrdjv"),
Type: pulumi.String(iotoperations.ExtendedLocationTypeCustomLocation),
},
InstanceName: pulumi.String("resource-name123"),
Properties: &iotoperations.DataflowProfilePropertiesArgs{
InstanceCount: pulumi.Int(3),
},
ResourceGroupName: pulumi.String("rgiotoperations"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var dataflowProfile = new AzureNative.IoTOperations.DataflowProfile("dataflowProfile", new()
{
DataflowProfileName = "aio-dataflowprofile",
ExtendedLocation = new AzureNative.IoTOperations.Inputs.ExtendedLocationArgs
{
Name = "qmbrfwcpwwhggszhrdjv",
Type = AzureNative.IoTOperations.ExtendedLocationType.CustomLocation,
},
InstanceName = "resource-name123",
Properties = new AzureNative.IoTOperations.Inputs.DataflowProfilePropertiesArgs
{
InstanceCount = 3,
},
ResourceGroupName = "rgiotoperations",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.iotoperations.DataflowProfile;
import com.pulumi.azurenative.iotoperations.DataflowProfileArgs;
import com.pulumi.azurenative.iotoperations.inputs.ExtendedLocationArgs;
import com.pulumi.azurenative.iotoperations.inputs.DataflowProfilePropertiesArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var dataflowProfile = new DataflowProfile("dataflowProfile", DataflowProfileArgs.builder()
.dataflowProfileName("aio-dataflowprofile")
.extendedLocation(ExtendedLocationArgs.builder()
.name("qmbrfwcpwwhggszhrdjv")
.type("CustomLocation")
.build())
.instanceName("resource-name123")
.properties(DataflowProfilePropertiesArgs.builder()
.instanceCount(3)
.build())
.resourceGroupName("rgiotoperations")
.build());
}
}
resources:
dataflowProfile:
type: azure-native:iotoperations:DataflowProfile
properties:
dataflowProfileName: aio-dataflowprofile
extendedLocation:
name: qmbrfwcpwwhggszhrdjv
type: CustomLocation
instanceName: resource-name123
properties:
instanceCount: 3
resourceGroupName: rgiotoperations
Setting instanceCount to 3 creates three parallel dataflow processors. Each instance handles a portion of the workload, increasing overall throughput. This extends the minimal configuration by adjusting a single property.
Enable diagnostics with logs and metrics
Production deployments need observability to monitor dataflow health and performance.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const dataflowProfile = new azure_native.iotoperations.DataflowProfile("dataflowProfile", {
dataflowProfileName: "resource-name123",
extendedLocation: {
name: "qmbrfwcpwwhggszhrdjv",
type: azure_native.iotoperations.ExtendedLocationType.CustomLocation,
},
instanceName: "resource-name123",
properties: {
diagnostics: {
logs: {
level: "rnmwokumdmebpmfxxxzvvjfdywotav",
},
metrics: {
prometheusPort: 7581,
},
},
instanceCount: 14,
},
resourceGroupName: "rgiotoperations",
});
import pulumi
import pulumi_azure_native as azure_native
dataflow_profile = azure_native.iotoperations.DataflowProfile("dataflowProfile",
dataflow_profile_name="resource-name123",
extended_location={
"name": "qmbrfwcpwwhggszhrdjv",
"type": azure_native.iotoperations.ExtendedLocationType.CUSTOM_LOCATION,
},
instance_name="resource-name123",
properties={
"diagnostics": {
"logs": {
"level": "rnmwokumdmebpmfxxxzvvjfdywotav",
},
"metrics": {
"prometheus_port": 7581,
},
},
"instance_count": 14,
},
resource_group_name="rgiotoperations")
package main
import (
iotoperations "github.com/pulumi/pulumi-azure-native-sdk/iotoperations/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := iotoperations.NewDataflowProfile(ctx, "dataflowProfile", &iotoperations.DataflowProfileArgs{
DataflowProfileName: pulumi.String("resource-name123"),
ExtendedLocation: &iotoperations.ExtendedLocationArgs{
Name: pulumi.String("qmbrfwcpwwhggszhrdjv"),
Type: pulumi.String(iotoperations.ExtendedLocationTypeCustomLocation),
},
InstanceName: pulumi.String("resource-name123"),
Properties: &iotoperations.DataflowProfilePropertiesArgs{
Diagnostics: &iotoperations.ProfileDiagnosticsArgs{
Logs: &iotoperations.DiagnosticsLogsArgs{
Level: pulumi.String("rnmwokumdmebpmfxxxzvvjfdywotav"),
},
Metrics: &iotoperations.MetricsArgs{
PrometheusPort: pulumi.Int(7581),
},
},
InstanceCount: pulumi.Int(14),
},
ResourceGroupName: pulumi.String("rgiotoperations"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var dataflowProfile = new AzureNative.IoTOperations.DataflowProfile("dataflowProfile", new()
{
DataflowProfileName = "resource-name123",
ExtendedLocation = new AzureNative.IoTOperations.Inputs.ExtendedLocationArgs
{
Name = "qmbrfwcpwwhggszhrdjv",
Type = AzureNative.IoTOperations.ExtendedLocationType.CustomLocation,
},
InstanceName = "resource-name123",
Properties = new AzureNative.IoTOperations.Inputs.DataflowProfilePropertiesArgs
{
Diagnostics = new AzureNative.IoTOperations.Inputs.ProfileDiagnosticsArgs
{
Logs = new AzureNative.IoTOperations.Inputs.DiagnosticsLogsArgs
{
Level = "rnmwokumdmebpmfxxxzvvjfdywotav",
},
Metrics = new AzureNative.IoTOperations.Inputs.MetricsArgs
{
PrometheusPort = 7581,
},
},
InstanceCount = 14,
},
ResourceGroupName = "rgiotoperations",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.iotoperations.DataflowProfile;
import com.pulumi.azurenative.iotoperations.DataflowProfileArgs;
import com.pulumi.azurenative.iotoperations.inputs.ExtendedLocationArgs;
import com.pulumi.azurenative.iotoperations.inputs.DataflowProfilePropertiesArgs;
import com.pulumi.azurenative.iotoperations.inputs.ProfileDiagnosticsArgs;
import com.pulumi.azurenative.iotoperations.inputs.DiagnosticsLogsArgs;
import com.pulumi.azurenative.iotoperations.inputs.MetricsArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var dataflowProfile = new DataflowProfile("dataflowProfile", DataflowProfileArgs.builder()
.dataflowProfileName("resource-name123")
.extendedLocation(ExtendedLocationArgs.builder()
.name("qmbrfwcpwwhggszhrdjv")
.type("CustomLocation")
.build())
.instanceName("resource-name123")
.properties(DataflowProfilePropertiesArgs.builder()
.diagnostics(ProfileDiagnosticsArgs.builder()
.logs(DiagnosticsLogsArgs.builder()
.level("rnmwokumdmebpmfxxxzvvjfdywotav")
.build())
.metrics(MetricsArgs.builder()
.prometheusPort(7581)
.build())
.build())
.instanceCount(14)
.build())
.resourceGroupName("rgiotoperations")
.build());
}
}
resources:
dataflowProfile:
type: azure-native:iotoperations:DataflowProfile
properties:
dataflowProfileName: resource-name123
extendedLocation:
name: qmbrfwcpwwhggszhrdjv
type: CustomLocation
instanceName: resource-name123
properties:
diagnostics:
logs:
level: rnmwokumdmebpmfxxxzvvjfdywotav
metrics:
prometheusPort: 7581
instanceCount: 14
resourceGroupName: rgiotoperations
The diagnostics property configures logging and metrics collection. The logs.level property controls log verbosity. The metrics.prometheusPort property exposes metrics on port 7581 for Prometheus scrapers. This adds observability to the basic profile configuration.
Beyond these examples
These snippets focus on specific dataflow profile features: instance count scaling, diagnostics configuration, and custom location placement. They’re intentionally minimal rather than full IoT data pipelines.
The examples reference pre-existing infrastructure such as Azure IoT Operations instances, Azure custom locations (Arc-enabled Kubernetes clusters), and resource groups. They focus on configuring the profile rather than provisioning the surrounding IoT Operations environment.
To keep things focused, common dataflow patterns are omitted, including:
- Dataflow definitions (separate Dataflow resources)
- Endpoint configurations (separate DataflowEndpoint resources)
- Authentication and authorization settings
- Network policies and ingress configuration
These omissions are intentional: the goal is to illustrate how each profile feature is wired, not provide drop-in IoT solutions. See the DataflowProfile resource reference for all available configuration options.
Let's configure Azure IoT Operations Dataflow Profiles
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Configuration & Immutability
extendedLocation, dataflowProfileName, instanceName, and resourceGroupName. You’ll need to recreate the resource to change any of these.CustomLocation as the type for extendedLocation. All examples in the schema use this type for edge location configuration.Scaling & Instances
instanceCount determines how many dataflow profile instances to deploy. Examples show configurations with 1 instance (minimal), 3 instances (multi), and 14 instances (full).Diagnostics & Monitoring
diagnostics property with logs (level) and metrics (prometheusPort). The minimal example omits diagnostics entirely, showing it’s not required.API Versions
pulumi package add azure-native iotoperations [ApiVersion] to generate a local SDK package. Available versions include 2024-08-15-preview, 2024-09-15-preview, 2025-04-01, 2025-07-01-preview, 2025-10-01, and 2026-03-01.Using a different cloud?
Explore integration guides for other cloud providers: