Определение возможности (и почему) Application Insights может отправлять данные телеметрии в Azure

Я занимаюсь разработкой приложения для рабочего стола Windows и успешно связал сборки Application Insights Core. я используюTrackTrace, TrackEventи т. д. для отправки пользовательских телеметрии.

На некоторых рабочих станциях телеметрия успешно отправляется на портал Azure, а на других - нет, хотя звонкиTrackTrace, Flushи т. д. успешны (или, по крайней мере, возвращаются без исключения.TelemetryClient.IsEnabled() возвращает истину. Обе рабочие станции используютInMemoryChannelс той же конечной точкойhttps://dc.services.visualstudio.com/v2/track и интервал отправки составляет 30 секунд.

Есть ли функция API, которую я могу вызвать в своем приложении, чтобы получить статус подключения TelemetryClient? Что-то, что скажет мне, что клиент успешно подключен, или что он столкнулся с ошибкойx пытаясь, и до сих порy пакеты телеметрии, ожидающие отправки.

Я не ищу контрольный список, какпереустановите пакет NuGet (Я сделал...),Убедитесь, что ваш брандмауэр разрешает трафик на порт ххх (это делает ...) илипопробуй установить кб ... 871 (Я тоже это сделал ...). Что мне нужно, так это отчет о состоянии, в котором я могу войти где-нибудь на клиентской рабочей станции во время работы моего приложения, по крайней мере, подтвердить в строке состояния (да, я знаю, что строки состояния настолько старомодны в наши дни), что возникает проблема.

Первое обновление - получение размера очереди

Первой победой мне удалось получить размер очереди. Я хотел сделать это без создания собственной реализации канала (пока). Это, однако, мало помогает в обнаружении перебоев, потому что очередь истощается, даже если передатчик не может передавать элементы телеметрии (он просто отбрасывает их) - подробнее об этом позже. По крайней мере, вы знаете, что поток передатчика работает ...

private ITelemetryChannel _TelemetryChannel;
private InMemoryChannel _InMemoryChannel;
private object _TelemetryBuffer;
private object _BufferLock;
private object _InMemoryTransmitter;

_TelemetryChannel = TelemetryConfiguration.Active?.TelemetryChannel;
if (_TelemetryChannel != null && _TelemetryChannel is InMemoryChannel)
{
  _InMemoryChannel = (InMemoryChannel)_TelemetryChannel;
  _TelemetryBuffer = GetInstanceField (_InMemoryChannel, "buffer");
  _BufferLock = GetInstanceField (_TelemetryBuffer, "lockObj");
  _InMemoryTransmitter = GetInstanceField (_InMemoryChannel, "transmitter");
}

public int GetTelemetryQueueSize ()
{
    if (_BufferLock != null)
    {
        lock (_BufferLock)
        {
            object l = GetInstanceField (_TelemetryBuffer, "items");
            if (l is List<ITelemetry>)
            {
                return ((List<ITelemetry>)l).Count;
            }
        }
    }
    return -1;
}

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

private static object GetInstanceField (Type type, object instance, string fieldName)
{
    if (instance == null)
    {
        return null;
    }
    try
    {
        BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
        FieldInfo field = type.GetField (fieldName, bindFlags);
        return field.GetValue (instance);
    }
    catch
    {
        return null;
    }
}

private static object GetInstanceField (object instance, string fieldName)
{
    if (instance == null)
    {
        return null;
    }
    return GetInstanceField (instance.GetType (), instance, fieldName);
}

Ответы на вопрос(2)

Ваш ответ на вопрос