Прием данных Kusto из приложения Azure Function заканчивается на 403 - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь вставить данные из функционального приложения azure в базу данных ADX. Я следовал инструкции, найденной в статье здесь .

Разница в том, что я хотел бы вставить данные в таблицу. Я борюсь с ошибкой 403 "Principal 'aadapp =;' У меня нет прав доступа к таблице "

. Что я сделал: я создал приложение AAD со следующими разрешениями API: настроено разрешение приложения AAD

Я настроил база данных через Kusto Explorer:

.add база данных myDB ingestors ('aadapp =;') 'theAADAppname'

.add table PressureRecords ingestors ('aadapp =;') 'theAADAppname '

.add table InGestors TemperatureRecords (' aadapp =; ')' theAADAppname '

Мой код:

 var kcsbDM = new KustoConnectionStringBuilder($"https://ingest-{serviceNameAndRegion}.kusto.windows.net:443/").WithAadApplicationKeyAuthentication(
            applicationClientId: "<my AD app Id>",
            applicationKey: "<my App Secret from Certificates & secrets>",
            authority: "<my tenant Id>");

        using (var ingestClient = KustoIngestFactory.CreateQueuedIngestClient(kcsbDM))
        {

            var ingestProps = new KustoQueuedIngestionProperties(databaseName, tableName);
            ingestProps.ReportLevel = IngestionReportLevel.FailuresAndSuccesses;
            ingestProps.ReportMethod = IngestionReportMethod.Queue;
            ingestProps.JSONMappingReference = mappingName;
            ingestProps.Format = DataSourceFormat.json;

            using (var memStream = new MemoryStream())
            using (var writer = new StreamWriter(memStream))
            {
                var messageString = JsonConvert.SerializeObject(myObject); // maps to the table / mapping 
                writer.WriteLine(messageString);
                writer.Flush();
                memStream.Seek(0, SeekOrigin.Begin);

                // Post ingestion message
                ingestClient.IngestFromStream(memStream, ingestProps, leaveOpen: true);
            }

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Обновление : проблема исправлена ​​в системе и теперь работает как положено.

Авнера благодарит вас за подсказку, возможно, это проблема из-за двойного перевода Real против двойного. В одной из моих первых попыток я использовал double в таблице, и это сработало. Это уже невозможно, выглядит, что поддерживаемые типы данных изменены.

Моя текущая конфигурация:

.create table PressureRecords ( Timestamp:datetime, DeviceId:guid, Pressure:real )

.create-or-alter table PressureRecords ingestion json mapping "PressureRecords"
'['
'{"column":"TimeStamp","path":"$.DateTime","datatype":"datetime","transform":null},'
'{"column":"DeviceId","path":"$.DeviceId","datatype":"guid","transform":null},'
'{"column":"Pressure","path":"$.Pressure","datatype":"real","transform":null}'
']'

public class PressureRecord
{
    [JsonProperty(PropertyName = "Pressure")]
    public double Pressure { get; set; }
    [JsonProperty(PropertyName = "DateTime")]
    public DateTime DateTime { get; set; } = DateTime.Now;
    [JsonProperty(PropertyName = "DeviceId")]
    [Key]
    public Guid DeviceId { get; set; }
}
0 голосов
/ 17 марта 2020

Проблема в том, что сопоставление, которое вы используете в этой команде приема, не соответствует существующей схеме таблицы (у нее есть дополнительные столбцы). В этих случаях Azure Data Explorer (Kusto) пытается добавить дополнительные столбцы, которые он находит в сопоставлениях. Так как у приложения есть разрешение «ingestor», оно не может изменять структуру таблицы и, следовательно, загрузка не выполняется.

В указанном вами случае c в вашей таблице есть столбец, который записан в указанном c корпусе, а в отображении приема данных тот же столбец имеет другой корпус (для одного символа), поэтому он обрабатывается в качестве нового столбца.

Мы рассмотрим предоставление лучшего сообщения об ошибке в этом случае.

...