Подсчитать количество запросов в диапазоне 24 часа для определения пользовательских сессий? - PullRequest
0 голосов
/ 04 октября 2019

Представьте себе журнал веб-сервера, содержащий такие строки, как:

<timestamp> <ip> <user-agent> <product page>

Мне нужен отчет, который

  • подсчитывает количество запросов на страницу продукта за сеанс пользователя в течение 24 часовокно со следующими критериями:
  • уникальный пользователь определяется как комбинация количества столбцов ()
  • 24-часовое окно начинается с отметки времени первого запроса на странице продукта (24-часовое окно может начинатьсяв любой час)
  • , если между отметкой времени запросов прошло больше 24 часов, это будет считаться новым сеансом пользователя

Для следующих журналов:

2019-1-1 01:00 1.2.3.4 Netscape product 5
2019-1-1 01:01 1.2.3.4 Netscape product 5
2019-1-1 01:00 1.2.3.5 Chrome product 5
2019-1-1 01:01 1.2.3.5 Chrome product 5
2019-1-1 01:59 1.2.3.4 Netscape product 5
2019-1-1 02:00 1.2.3.4 Netscape product 4
2019-1-1 02:01 1.2.3.4 Netscape product 4
2019-1-1 02:02 1.2.3.4 Netscape product 4
2019-1-1 07:43 1.2.3.5 Chrome product 5
2019-1-2  2:01 1.2.3.4 Netscape product 5

выдаст:

1.2.3.4/Netscape, product 4, 1
1.2.3.4/Netscape, product 5, 2
1.2.3.5/Chrome: product 5, 1

и, возможно, второй запрос выдаст:

1.2.3.4/Netscape, 6
1.2.3.4/Netscape, 1
1.2.3.5/Chrome, 3

(количество запросов на пользователя в 24-часовом окне, следовательно, 1.2.3.4/Netscape указан дважды)

Какими будут примеры запросов, которые доставят оба вышеуказанных набора результатов?

Бонус / необязательно: если запросы в течение 24-часового периода находятся на расстоянии более 30 м между ними, это будет считаться другимее новый сеанс

1 Ответ

0 голосов
/ 05 октября 2019

вот что может дать вам направление (хотя не обязательно слишком производительное / эффективное, в зависимости от размера набора входных данных).

datatable(timestamp:datetime, ip:string, user_agent:string, product_page:string)
[
    datetime(2019-01-01 01:00), '1.2.3.4', 'Netscape', 'product 5',
    datetime(2019-01-01 01:01), '1.2.3.4', 'Netscape', 'product 5',
    datetime(2019-01-01 01:00), '1.2.3.5', 'Chrome',   'product 5',
    datetime(2019-01-01 01:01), '1.2.3.5', 'Chrome',   'product 5',
    datetime(2019-01-01 01:59), '1.2.3.4', 'Netscape', 'product 5',
    datetime(2019-01-01 02:00), '1.2.3.4', 'Netscape', 'product 4',
    datetime(2019-01-01 02:01), '1.2.3.4', 'Netscape', 'product 4',
    datetime(2019-01-01 02:02), '1.2.3.4', 'Netscape', 'product 4',
    datetime(2019-01-01 07:43), '1.2.3.5', 'Chrome',   'product 5',
    datetime(2019-01-02 02:01), '1.2.3.4', 'Netscape', 'product 5',
]
| extend user = strcat(ip, "/", user_agent)
| order by user asc, timestamp asc
| extend session_start = row_window_session(timestamp, 24h, 24h, user_agent != prev(user_agent) or product_page != prev(product_page) or ip != prev(ip))
| summarize session_count = dcount(session_start) by user, product_page

->

| user             | product_page | session_count |
|------------------|--------------|---------------|
| 1.2.3.4/Netscape | product 5    | 2             |
| 1.2.3.4/Netscape | product 4    | 1             |
| 1.2.3.5/Chrome   | product 5    | 1             |

для второго запроса может работать следующее:

datatable(timestamp:datetime, ip:string, user_agent:string, product_page:string)
[
    datetime(2019-01-01 01:00), '1.2.3.4', 'Netscape', 'product 5',
    datetime(2019-01-01 01:01), '1.2.3.4', 'Netscape', 'product 5',
    datetime(2019-01-01 01:00), '1.2.3.5', 'Chrome',   'product 5',
    datetime(2019-01-01 01:01), '1.2.3.5', 'Chrome',   'product 5',
    datetime(2019-01-01 01:59), '1.2.3.4', 'Netscape', 'product 5',
    datetime(2019-01-01 02:00), '1.2.3.4', 'Netscape', 'product 4',
    datetime(2019-01-01 02:01), '1.2.3.4', 'Netscape', 'product 4',
    datetime(2019-01-01 02:02), '1.2.3.4', 'Netscape', 'product 4',
    datetime(2019-01-01 07:43), '1.2.3.5', 'Chrome',   'product 5',
    datetime(2019-01-02 02:01), '1.2.3.4', 'Netscape', 'product 5',
]
| extend user = strcat(ip, "/", user_agent)
| summarize count() by user, startofday(timestamp)
| project-away timestamp

->

| user             | count_ |
|------------------|--------|
| 1.2.3.4/Netscape | 6      |
| 1.2.3.5/Chrome   | 3      |
| 1.2.3.4/Netscape | 1      |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...