Краткое руководство. Отправка событий в Центры событий Azure с помощью C

Введение

Центры событий Azure — это платформа потоковой передачи больших данных и служба приема событий, принимающая и обрабатывающая миллионы событий в секунду. Центры событий могут обрабатывать и сохранять события, данные и телеметрию, созданные распределенным программным обеспечением и устройствами. Данные, отправляемые в концентратор событий, можно преобразовывать и сохранять с помощью любого поставщика аналитики в реальном времени, а также с помощью адаптеров пакетной обработки или хранения. Подробный обзор Центров событий см. в статьях Что такое Центры событий Azure? и Обзор функций Центров событий.

В этом руководстве описано, как отправлять события в концентратор событий с помощью консольного приложения на языке C.

Необходимые компоненты

Для работы с этим руководством вам нужно следующее:

  • Среда разработки C. В этом учебнике предполагается, что применяется стек gcc на виртуальной машине Azure Linux с Ubuntu 14.04.
  • Microsoft Visual Studio.
  • Создайте пространство имен Центров событий и концентратор событий. Вы можете использовать портал Azure для создания пространства имен типа Центров событий и получать учетные данные для управления, требуемые приложению для взаимодействия с концентратором событий. Чтобы создать пространство имен и концентратор событий, выполните инструкции из этой статьи. Получите значение ключа доступа для концентратора событий, следуя инструкциям в разделе Получение строки подключения на портале. Используйте ключ доступа в коде, который вы напишете далее в рамках этого руководства. По умолчанию для ключа используется имя RootManageSharedAccessKey.

Написание кода для отправки сообщений в Центры событий

Из этого раздела вы узнаете, как написать приложение для отправки событий в концентратор на языке C. В коде используется библиотека Proton AMQP из проекта Apache Qpid. Эта процедура аналогична использованию очередей и разделов службы "Служебная шина" с AMQP на C, как показано в этом примере. Дополнительную информацию см. в документации по Qpid Proton.

  1. Чтобы установить Qpid Proton, следуйте инструкциям для своей среды на странице Qpid AMQP Messenger.

  2. Для компиляции библиотеки Proton установите следующие пакеты.

    sudo apt-get install build-essential cmake uuid-dev openssl libssl-dev
    
  3. Скачайте библиотеку Qpid Proton и извлеките ее, например:

    wget https://archive.apache.org/dist/qpid/proton/0.7/qpid-proton-0.7.tar.gz
    tar xvfz qpid-proton-0.7.tar.gz
    
  4. Создайте каталог построения, скомпилируйте и установите:

    cd qpid-proton-0.7
    mkdir build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX=/usr ..
    sudo make install
    
  5. В рабочем каталоге создайте новый файл с именем sender.c со следующим кодом. Обязательно замените значения для ключа и имени, имени концентратора событий и пространства имен SAS. Также необходимо заменить версию ключа SendRule , закодированную как URL-адрес, созданную ранее. Выполнить кодировку как URL-адрес можно здесь.

    #include "proton/message.h"
    #include "proton/messenger.h"
    
    #include <getopt.h>
    #include <proton/util.h>
    #include <sys/time.h>
    #include <stddef.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <signal.h>
    
    volatile sig_atomic_t stop = 0;
    
    #define check(messenger)                                                     \
      {                                                                          \
        if(pn_messenger_errno(messenger))                                        \
        {                                                                        \
          printf("check\n");                                                     \
          die(__FILE__, __LINE__, pn_error_text(pn_messenger_error(messenger))); \
        }                                                                        \
      }
    
    void interrupt_handler(int signum){
      if(signum == SIGINT){
        stop = 1;
      }
    }
    
    pn_timestamp_t time_now(void)
    {
      struct timeval now;
      if (gettimeofday(&now, NULL)) pn_fatal("gettimeofday failed\n");
      return ((pn_timestamp_t)now.tv_sec) * 1000 + (now.tv_usec / 1000);
    }
    
    void die(const char *file, int line, const char *message)
    {
      printf("Dead\n");
      fprintf(stderr, "%s:%i: %s\n", file, line, message);
      exit(1);
    }
    
    int sendMessage(pn_messenger_t * messenger) {
        char * address = (char *) "amqps://{SAS Key Name}:{SAS key}@{namespace name}.servicebus.windows.net/{event hub name}";
        char * msgtext = (char *) "Hello from C!";
    
        pn_message_t * message;
        pn_data_t * body;
        message = pn_message();
    
        pn_message_set_address(message, address);
        pn_message_set_content_type(message, (char*) "application/octect-stream");
        pn_message_set_inferred(message, true);
    
        body = pn_message_body(message);
        pn_data_put_binary(body, pn_bytes(strlen(msgtext), msgtext));
    
        pn_messenger_put(messenger, message);
        check(messenger);
        pn_messenger_send(messenger, 1);
        check(messenger);
    
        pn_message_free(message);
    }
    
    int main(int argc, char** argv) {
        printf("Press Ctrl-C to stop the sender process\n");
        signal(SIGINT, interrupt_handler);
    
        pn_messenger_t *messenger = pn_messenger(NULL);
        pn_messenger_set_outgoing_window(messenger, 1);
        pn_messenger_start(messenger);
    
        while(!stop) {
            sendMessage(messenger);
            printf("Sent message\n");
            sleep(1);
        }
    
        // release messenger resources
        pn_messenger_stop(messenger);
        pn_messenger_free(messenger);
    
        return 0;
    }
    
  6. Скомпилируйте файл при условии gcc:

    gcc sender.c -o sender -lqpid-proton
    

    Примечание.

    В этом коде для периода отправки используется значение 1. Это обеспечивают максимальную скорость принудительной отправки сообщений. Рекомендуем сгруппировать сообщения в приложении, чтобы увеличить пропускную способность. Информацию об использовании библиотеки Qpid Proton в этой и других средах, а также на платформах, для которых предоставляются привязки (сейчас это Perl, PHP, Python и Ruby), см. на странице Qpid AMQP Messenger.

Запустите приложение для отправки сообщений в концентратор событий.

Поздравляем! Теперь вы можете отправлять сообщения в концентратор событий.

Следующие шаги

Ознакомьтесь со следующими статьями: