How to insert data into InfluxDB from Azure Functions in C# (C-sharp)?

Hi there,

I have Azure functions in C# and and InfluxDB hosted on Azure cloud. I am trying to send data remotely from C# code to influx DB 2.0. The health status on connection gives success but the data is not getting inserted into influxDB when I check on localhost:8086

Here is my code:


usingIoTHubTrigger=Microsoft.Azure.WebJobs.EventHubTriggerAttribute;

usingMicrosoft.Azure.WebJobs;

usingMicrosoft.Azure.WebJobs.Host;

usingMicrosoft.Azure.EventHubs;

usingSystem.Text;

usingSystem.Net.Http;

usingMicrosoft.Extensions.Logging;

usingSystem;

usingSystem.Text.Json;

usingSystem.Collections.Generic;

usingNewtonsoft.Json;

usingInfluxDB.Client;

usingInfluxDB.Client.Api.Domain;

usingInfluxDB.Client.Core;

usingInfluxDB.Client.Writes;

usingSystem.Threading.Tasks;

namespaceWatlow.Function

{​​​​​​​​

publicclassObject{​​​​​​​​

publicstringserial_number{​​​​​​​​get;set;}​​​​​​​​

publicfloatuniversal_input_1_mod_5{​​​​​​​​get;set;}​​​​​​​​

publicfloatuniversal_input_2_mod_5{​​​​​​​​get;set;}​​​​​​​​

publicfloatuniversal_input_3_mod_5{​​​​​​​​get;set;}​​​​​​​​

publicfloatuniversal_input_4_mod_5{​​​​​​​​get;set;}​​​​​​​​

publicstringdisplay_units{​​​​​​​​get;set;}​​​​​​​​

publicDateTimets{​​​​​​​​get;set;}​​​​​​​​

}​​​​​​​​

publicstaticclassIotHubDataProcessing

{​​​​​​​​

privatestaticHttpClientclient=newHttpClient();

[FunctionName(β€œIotHubDataProcessing”)]

publicstaticvoidRun([IoTHubTrigger(β€œmessages/events”,Connection=β€œConnectionString”)]EventDatamessage,ILoggerlog)

{​​​​​​​​

log.LogInformation($β€œC# IoT Hub trigger function processed a message: {​​​​​​​​Encoding.UTF8.GetString(message.Body.Array)}​​​​​​​​”);

Objectobj=JsonConvert.DeserializeObject(Encoding.UTF8.GetString(message.Body.Array));

WriteInflux(obj);

}​​​​​​​​

publicstaticasyncvoidWriteInflux(Objectobj)

{​​​​​​​​

conststringtoken=β€œpcSpeRibWx0Xak–KpLI23kk52LZDbPcRjKKpmtPqZ8l47_mlUMsrgG69XeSmchQ_apOWwmgh8CpN1QQ2oQTuQ==”;

conststringbucket=β€œtimeseriesDB”;

conststringorg=β€œxxxx”;

conststringpassword=β€œxxxxx”;

varclient=InfluxDBClientFactory.Create(β€œ[http://20.83.176.xxx:8086](http://20.83.176.xxx:8086/)”,β€œxxxx”,password.ToCharArray());

varhealth=awaitclient.HealthAsync();

if(health.Status.ToString()==β€œPass”){​​​​​​​​

Console.WriteLine(β€œConnection success.”);

}​​​​​​​​

else{​​​​​​​​

Console.WriteLine($"{​​​​​​​​health.Status}​​​​​​​​");

Console.WriteLine($β€œConnection failure: {​​​​​​​​health.Message}​​​​​​​​!”);

}​​​​​​​​

varpoint=PointData

.Measurement(β€œtemperature”)

.Tag(β€œserialNumber”,obj.serial_number)

.Field(β€œtc1”,obj.universal_input_1_mod_5)

.Field(β€œtc2”,obj.universal_input_2_mod_5)

.Field(β€œtc3”,obj.universal_input_3_mod_5)

.Field(β€œtc4”,obj.universal_input_4_mod_5)

.Timestamp(DateTime.UtcNow,WritePrecision.Ns);

using(varwriteApi=client.GetWriteApi())

{​​​​​​​​

writeApi.WritePoint(bucket,org,point);

}​​​​​​​​

}​​​​​​​​

}​​​​​​​​

}​​​​​​​​

Thanks in advance.Preformatted text

Hi @raginigupta6,

thanks for using our client. Could you share debug output from client? You can enable debug mode by:

var client = InfluxDBClientFactory.Create("http://20.83.176.xxx:8086", _token.ToCharArray());
client.SetLogLevel(LogLevel.Body);

There are also small glitches in your code

  1. The client doesn’t supports initialization with array of urls. This is not valid:
varclient=InfluxDBClientFactory.Create(β€œ[http://20.83.176.xxx:8086](http://20.83.176.xxx:8086/)”,β€œxxxx”,password.ToCharArray());

You should use url and token:

var client = InfluxDBClientFactory.Create("http://20.83.176.xxx:8086", _token.ToCharArray());
  1. The better choice for your use case will be use a WriteApiAsync than WriteApi.
var point = PointData.Measurement("temperature")
    .Tag("serialNumber", obj.serial_number)
    .Field("tc1", obj.universal_input_1_mod_5)
    .Field("tc2", obj.universal_input_2_mod_5)
    .Field("tc3", obj.universal_input_3_mod_5)
    .Field("tc4", obj.universal_input_4_mod_5)
    .Timestamp(DateTime.UtcNow, WritePrecision.Ns);

Trace.WriteLine($"Data to write: {point.ToLineProtocol()}");

await client.GetWriteApiAsync().WritePointAsync(bucket, org, point);

Regards

1 Like

Thank you so much, it’s working now :slight_smile: Thanks a lot!!