2016-02-09 22 views
7

Chúng tôi đang lưu trữ các tài liệu nhỏ trong ES đại diện cho một chuỗi các sự kiện cho một đối tượng. Mỗi sự kiện có dấu ngày/giờ. Chúng ta cần phân tích thời gian giữa các sự kiện cho tất cả các đối tượng trong một khoảng thời gian.Làm thế nào tôi có thể tạo một biểu đồ của các dấu thời gian tem?

Ví dụ, hãy tưởng tượng những tài liệu sự kiện json:

{ "đối tượng": "một", "sự kiện": "bắt đầu", "datetime": "2016/02/09 11:23:01" }

{ "đối tượng": "một", "sự kiện": "dừng lại", "datetime": "2016/02/09 11:25:01"}

{ "đối tượng": "hai "," sự kiện ":" bắt đầu "," ngày giờ ":" 2016-01-02 11:23:01 "}

{" đối tượng ":" hai "," sự kiện ":" dừng "," ngày giờ ":" 2016-01-02 11:24:01 "}

Những gì chúng tôi muốn thoát ra khỏi đây là biểu đồ vẽ hai dấu thời gian kết quả (bắt đầu dừng): 2 phút/120 giây cho đối tượng một và 1 phút/60 giây cho đối tượng hai.

Cuối cùng, chúng tôi muốn theo dõi thời gian giữa các sự kiện bắt đầu và dừng nhưng yêu cầu chúng tôi tính toán thời gian giữa các sự kiện đó rồi tổng hợp chúng hoặc cung cấp cho Kibana UI để được tổng hợp/vẽ. Lý tưởng nhất là chúng tôi muốn cung cấp kết quả trực tiếp cho Kibana để chúng tôi có thể tránh tạo bất kỳ giao diện người dùng tùy chỉnh nào.

Cảm ơn trước vì bất kỳ ý tưởng hoặc đề xuất nào.

+0

Tôi có một vài câu hỏi. EventA và EventB thuộc về tài liệu khác nhau? Ý nghĩa của từng đối tượng được xác định trong truy vấn là gì? Bạn có thể vui lòng chỉ định một ví dụ về những gì bạn muốn đạt được không? – Richa

+0

Ok, tôi đã cập nhật câu hỏi để cụ thể hơn một chút. Hãy cho tôi biết nếu điều này giải thích câu hỏi của tôi tốt hơn. –

+0

Tôi không thể thực hiện với cấu trúc tài liệu hiện tại của bạn. Bạn có thể thay đổi tài liệu của bạn để có các trường sau "đối tượng", eventStartTime "," eventStoptime " – Richa

Trả lời

2

Vì bạn đang mở để sử dụng Logstash, có một cách để làm điều đó bằng cách sử dụng aggregate filter

Lưu ý rằng đây là một plugin cộng đồng mà cần phải được cài đặt đầu tiên. (tức là nó không giao hàng với Logstash theo mặc định)

Ý tưởng chính của bộ lọc aggregate là hợp nhất hai dòng nhật ký "có liên quan". Bạn có thể cấu hình các plugin để nó biết những gì "liên quan" có nghĩa là. Trong trường hợp của bạn, "liên quan" có nghĩa là cả hai sự kiện phải chia sẻ cùng một object tên (ví dụ: one hoặc two) và sau đó là sự kiện đầu tiên có lĩnh vực event của nó với giá trị start và sự kiện thứ hai có lĩnh vực event của nó với giá trị stop.

Khi bộ lọc gặp sự kiện start, nó lưu trữ trường datetime của sự kiện đó trong bản đồ nội bộ. Khi nó gặp sự kiện stop, nó tính toán sự khác biệt thời gian giữa hai thời gian biểu và lưu trữ thời lượng tính bằng giây trong trường duration mới.

input { 
    ... 
} 
filter { 
    ...other filters 

    if [event] == "start" { 
     aggregate { 
      task_id => "%{object}" 
      code => "map['start'] = event['datetime']" 
      map_action => "create" 
     } 
    } else if [event] == "stop" { 
     aggregate { 
      task_id => "%{object}" 
      code => "map['duration'] = event['datetime'] - map['start']" 
      end_of_task => true 
      timeout => 120 
     } 
    } 
} 
output { 
    elasticsearch { 
     ... 
    } 
} 

Lưu ý rằng bạn có thể điều chỉnh giá trị timeout (ở đây 120 giây) để phù hợp hơn với nhu cầu của bạn. Khi hết thời gian chờ và không có sự kiện dừng nào xảy ra, sự kiện bắt đầu hiện tại sẽ bị bỏ qua.

+0

Công việc này có hiệu quả không? Có điều gì khác bạn cần biết không? – Val

+0

Cảm ơn Val. Đánh giá cao câu trả lời. Có vẻ như giải pháp chúng ta đang làm. Cảm ơn một lần nữa. –

+0

Tuyệt vời, vui vì nó đã giúp !! – Val

Các vấn đề liên quan