Cumulocity epr различия с esper

Я тестировал некоторые правила, которые написал в Cumulocity, и, поскольку я не мог получить желаемых результатов, я попытался использовать онлайн-инструмент Esper EPL для сравнения. Оказывается, я обнаружил разницу в результатах между двумя, которую не могу объяснить.

По сути, я хочу создать контекст, разделенный по источникам и разделенный событиями «start» и «stop». Затем, когда мой контекст заканчивается, я хочу отобразить некоторые детали (тип и время) только из моих начальных и конечных событий (в данный момент меня не интересуют промежуточные события).

Вот мое правило (схема создания должна быть удалена для Cumulocity, потому что они уже определены «изначально»):

create schema EventCreated(
  source String,
  type String,
  time Date
);

create schema CreateMeasurement(
  source String,
  type String,
  time Date,
  fragments Object
);



@Name("create_context")
create context Trip
    context bySource
        partition by source from EventCreated,

    context byEvents
        start EventCreated(
            type = "c8y_ObdConnectionReport" or
            type = "c8y_PowerOnReport" or
            type = "c8y_FixedReport" or
            type = "c8y_HarshBehaviorReport") as startEvent

        end EventCreated(
            type = "c8y_ObdDisconnectionReport" or
            type = "c8y_PowerOffReport" or
            type = "c8y_SilentTracker") as endEvent;



@Name("context_end")
context Trip
    insert into
        CreateMeasurement

    select
        context.bySource.key1 as source,
        "Trip" as type,
        e.time as time,
        {
            "startedBy", context.byEvents.startEvent.type,
            "startedAt", context.byEvents.startEvent.time,
            "endedBy", e.type,
            "endedAt", e.time
        } as fragments

    from
        EventCreated e

    output
        last when terminated;

А вот простая последовательность событий, чтобы увидеть разницу:

EventCreated = {
    source = '1672192',
    type = 'c8y_ObdConnectionReport',
    time =  '2016-10-07T10:00:00.000'
}

t = t.plus(5 minutes)

EventCreated = {
    source = '1672192',
    type = 'c8y_FixedReport',
    time =  '2016-10-07T10:05:00.000'
}

t = t.plus(5 minutes)

EventCreated = {
    source = '1672192',
    type = 'c8y_ObdDisconnectionReport',
    time =  '2016-10-07T10:10:00.000'
}

Итак, вот результат использования онлайн-симулятора EPL:

At: 2016-10-07 10:05:00.000
    Statement: context_end
        Insert
            CreateMeasurement={
                source='1672192',
                type='Trip',
                time='2016-10-07T10:05:00.000',
                fragments[
                    'startedBy','c8y_ObdConnectionReport',
                    'startedAt','2016-10-07T10:00:00.000',
                    'endedBy','c8y_ObdDisconnectionReport',
                    'endedAt','2016-10-07T10:10:00.000']}

Это то, что я хочу, как и ожидалось, я получил подробную информацию о моем первом и последнем мероприятии. Вот что я получаю с Cumulocity:

{
   "source":{
      "id":"1672192",
      "name":"Tracker 123456789000000",
      "self":"http://tracker.post-iot.lu/inventory/managedObjects/1672192"},
   "type":"Trip",
   "time":"2016-10-25T11:56:46.983+02:00",
   "self":"http://tracker.post-iot.lu/measurement/measurements/null",
   "startedBy":"c8y_ObdConnectionReport",
   "startedAt":"2016-10-25 11:56:44+0200",
   "endedBy":"c8y_FixedReport",
   "endedAt":"2016-10-25 11:56:46+0200"
}

(Не обращайте внимания на даты, я работаю с Cumulocity в режиме реального времени). Как видите, последним событием считается FixedReport, а не DisconnectionReport. Итак, что в основном происходит в Cumulocity (я пробовал различные ситуации), так это то, что конечное событие контекста каждый раз игнорируется, поэтому я могу получить только предпоследнее событие.

В чем разница с двигателем Esper? Как я могу заставить эту работу работать так, как я думаю?


person Gaetan L.    schedule 25.10.2016    source источник
comment
Теперь у меня та же проблема с начальным событием (я получаю только второе, когда использую context.byEvents.startEvent).   -  person Gaetan L.    schedule 26.10.2016


Ответы (1)


Вероятно, это случайная проблема, что онлайн-инструмент esper всегда обрабатывает последнее событие, а совокупность - одно предпоследнее.

Какой именно случай произойдет, зависит от того, какой оператор («create_context или« context_end ») будет выполнен первым. Однако порядок выполнения операторов является случайным, если не указана аннотация @Priority.

Согласно примечанию в документации esper (http://www.espertech.com/esper/release-5.3.0/esper-reference/html/context.html#context_def_nonoverlapping)

Если вы указали фильтр или шаблон событий в качестве конечного условия для раздела контекста, а операторы, которые ссылаются на контекст, определяют фильтр или шаблон событий, который соответствует тем же условиям, используйте @Priority, чтобы указать механизму, будет ли управление контекстом или оператор оценка имеет приоритет (см. ниже для настройки приоритетного выполнения). Например, если ваше объявление контекста выглядит так:

create context MyCtx start MyStartEvent end MyEndEvent

И утверждение, управляемое контекстом, выглядит следующим образом:

context MyCtx select count(*) as cnt from MyEndEvent output when terminated

Используя @Priority (1) для контекста создания и @Priority (0) для оператора подсчета, оператор подсчета не считает последнее событие MyEndEvent, поскольку управление разделами контекста имеет приоритет. Используя @Priority (0) для контекста создания и @Priority (1) для оператора подсчета, оператор подсчета будет считать последнее событие MyEndEvent, поскольку оценка оператора имеет приоритет.

Исправление: добавьте @Priority (0) в оператор create_context и @Priority (1) в оператор context_end.

person Dominik Bielicki    schedule 26.10.2016
comment
Я собираюсь попробовать это, однако я не очень верю в случайный аспект этого, потому что КАЖДЫЙ раз, когда я пробовал его на онлайн-платформе EPL, он работал, как ожидалось, и КАЖДЫЙ раз этого не было на Cumulocity. Кроме того, как я прокомментировал выше, теперь у меня такая же проблема с моим стартовым событием, которое я больше не могу получить в конце контекста (только событие №2). - person Gaetan L.; 26.10.2016