Helpex - Trao đổi & giúp đỡ Đăng nhập

Triển khai Trình thu thập nhật ký bằng Cầu chì JBoss Mũ đỏ và Mũ đỏ JBoss ...

Hầu hết thời gian, khi chúng ta nghĩ về việc thu thập, phân tích cú pháp và lưu trữ nhật ký, điều đầu tiên xuất hiện trong đầu chúng ta là ElasticStack hoặc ELK. Nó có vị trí tốt trong tâm trí của các nhà phát triển và hệ thống. Ngăn xếp kết hợp các dự án Elasticsearch, Logstash và Kibana phổ biến với nhau để dễ dàng thu thập / tổng hợp, lưu trữ và trực quan hóa nhật ký ứng dụng. Với tư cách là một người cưỡi lạc đà Apache và là người đam mê Infinispan, tôi đã chuẩn bị bài tập này để tạo ra bộ thu thập nhật ký và ngăn xếp lưu trữ của riêng tôi bằng cách sử dụng các sản phẩm của Red Hat, JBoss Fuse và JBoss Data Grid, thay vào đó.

JBoss Fuse và JBoss Data Grid là gì?

Red Hat JBoss Fuse là một nền tảng tích hợp nhẹ giúp giảm bớt khó khăn trong việc kết nối các ứng dụng, dịch vụ, quy trình và thiết bị. JBoss Fuse bao gồm dự án Apache Camel đa năng và phổ biến, một triển khai các mẫu tích hợp doanh nghiệp được sử dụng phổ biến nhất và hơn 150 trình kết nối sẵn sàng sử dụng. JBoss Fuse sẽ thu thập dữ liệu nhật ký và thay thế phần Logstash của ngăn xếp.

Mặt khác, Red Hat JBoss Data Grid là một lưới dữ liệu trong bộ nhớ và giải pháp lưu trữ dữ liệu NoSQL giúp các ứng dụng truy cập, xử lý và phân tích dữ liệu ở tốc độ trong bộ nhớ. Dựa trên Infinispan, JBoss Data Grid cung cấp khả năng tìm kiếm Lucene dễ dàng cho các đối tượng bằng cách sử dụng các giá trị và phạm vi mà không cần tra cứu dựa trên khóa hoặc vị trí chính xác của đối tượng. Các truy vấn liên tục cung cấp kết quả mới nhất trong thời gian thực mà không cần bỏ phiếu. Thành phần này thay thế Elasticsearch trong ngăn xếp của chúng tôi.

Thiết kế

Với mục đích của bài đăng này, tôi thu thập dữ liệu nhật ký được tạo bởi Máy chủ lưới dữ liệu JBoss. Giải pháp đọc server.logtệp được tạo bởi máy chủ, phân tích cú pháp mọi dòng nhật ký bằng cách sử dụng biểu thức chính quy và sắp xếp nó thành JSON. Sau đó, mỗi thông báo sẽ được chèn và lập chỉ mục trong lưới dữ liệu.

Triển khai Trình thu thập nhật ký bằng Cầu chì JBoss Mũ đỏ và Mũ đỏ JBoss ...

Nằm ngoài phạm vi của bài đăng này là phần hình dung của dự án. Bạn có thể thử Red Hat JBoss Data Virtualization có trình kết nối riêng với cụm JBoss Data Grid. Các công cụ trực quan hóa dựa trên dự án cộng đồng Dashbuilder. Đối với ví dụ này, tôi truy vấn dữ liệu bằng cách sử dụng API REST được nhúng từ Máy chủ lưới dữ liệu JBoss.

Thiết lập Môi trường

Tôi sẽ cho rằng bạn đã quen thuộc với Java EE và Spring Development, và bạn đã thiết lập IDE phát triển của mình. Nếu bạn chưa thực hiện phần sau, bạn có thể xem Blog của nhà phát triển Red Hat về cách thiết lập và định cấu hình Red Hat JBoss Developer Studio.

Bạn cũng sẽ cần tải xuống Máy chủ Lưới Dữ liệu JBoss từ Red Hat Developers ( liên kết ) hoặc Cổng thông tin khách hàng (nếu bạn là khách hàng của Red Hat) để định cấu hình nó ở chế độ máy khách-máy chủ.

Nếu bạn quá muốn đọc toàn bộ bài đăng, bạn có thể xem mã hoàn chỉnh từ GitHub .

Người thu thập nhật ký

Tôi đã sử dụng phiên bản Apache Camel mới nhất đi kèm với phiên bản 6.3.0 của JBoss Fuse maven Bill of Materials (BOM). Bạn có thể kiểm tra một đoạn mã của tệp pom.xml của dự án với các phiên bản bắt buộc cho dự án này.

<properties>
    <camel.version>2.17.0.redhat-630224</camel.version>
    <jboss.fuse.bom.version>6.3.0.redhat-224</jboss.fuse.bom.version>
    <jboss.datagrid.version>6.6.1.Final-redhat-1</jboss.datagrid.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.fuse.bom</groupId>
            <artifactId>jboss-fuse-parent</artifactId>
            <version>${jboss.fuse.bom.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Bạn có thể sử dụng nguyên mẫu maven có trong JBoss Developer Studio để tạo một dự án dựa trên Spring hoặc bắt đầu với một dự án trống.

Đối với trình thu thập nhật ký, tôi sử dụng thành phần Luồng cho phép chúng tôi tương tác với các luồng như  System.in/ System.outhoặc tệp. Tôi không sử dụng thành phần Tệp, vì tôi muốn mở luồng chờ dữ liệu mới, giống như taillệnh Linux . Bạn cần thêm phụ thuộc cho camel-streamthành phần.

<dependency>
     <groupId>org.apache.camel</groupId>
     <artifactId>camel-stream</artifactId>
 </dependency>

Trình thu thập nhật ký bao gồm Tuyến lạc đà có thành phần luồng là trình tiêu thụ tệp với scanStreamcờ được đặt thành true. Mỗi dòng được ghi vào tệp sẽ trở thành một thông điệp.

<from uri="stream:file?fileName=/opt/jboss-datagrid-6.6/standalone/log/server.log&scanStream=true"/>

Bước thứ hai của tuyến đường là phân tích cú pháp dòng. ElasticStack sử dụng Grok để thực hiện phân tích cú pháp cho ngăn xếp này; chúng tôi sẽ sử dụng Bộ xử lý Java Bean để khớp dòng với regex trình phân tích cú pháp JBoss EAP được xác định trước. Ý tưởng là xây dựng các plugin cho từng loại nhật ký mà chúng ta có thể thêm vào giải pháp như bộ lọc, bài đăng hoặc bộ xử lý trước. Đây là mã của JBossEAPLogParser.javatệp của tôi :

package mx.redhat.demo.fuse;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JBossEAPLogParser implements Processor 
{
    private Logger log = LoggerFactory.getLogger(JBossEAPLogParser.class); 
    private String pattern = "(?.{12}+) (?.{5}+) \[(?.+)\] \((?[^\)]+)\) (?.+)";
    private Pattern compile = Pattern.compile(pattern);
    private String[] tokens = { "time", "level", "class", "thread", "message"};
    private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

    @Override
    public void process(Exchange exchange) throws Exception 
    {
        String payload = exchange.getIn().getBody(String.class);
        log.trace("Processing payload: %s", payload);
        Map<String, String> map = processMessage(payload);
        map.put("message", payload);
        map.put("@timestamp", formatter.format(new Date()));
        exchange.getOut().setBody(map);
    }

    public Map<String, String> processMessage(String data) 
    {
        Map<String, String> map = new HashMap<String, String>();
        Matcher matcher = compile.matcher(data);
        if(matcher.find())
        {
            for(String token : tokens) 
            {
                String myNamedGroup= matcher.group(token);
                log.trace("Token %s group: %s \n", token, myNamedGroup);
                map.put(token, matcher.group(token)); 
            }
        }
        return map;
    }
}

Việc xử lý thông báo thêm dấu thời gian và nhiều dữ liệu ngữ cảnh hơn như cấp nhật ký, lớp và luồng. Cuối cùng nó có thể thêm nhiều tùy chọn hơn như tên máy chủ hoặc tên máy chủ.

Kết quả của bước trước là một bản đồ mà bây giờ chúng ta sắp xếp bằng cách sử dụng thư viện Jackson để tạo ra đối tượng JSON ( liên kết ). Đừng quên thêm phần phụ thuộc Maven.

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jackson</artifactId>
</dependency>

Đây là cách tuyến đường trông:

<route>
     <from uri="stream:file?fileName=/opt/jboss-datagrid-6.6/standalone/log/server.log&scanStream=true"/>
     <bean beanType="mx.redhat.demo.fuse.JBossEAPLogParser"/>
     <marshal>
         <json library="Jackson"/>
     </marshal>
     <to uri="direct:infinispan"/>
</route>

Sau đó, tuyến chuyển tiếp thông báo đến infinispantuyến sẽ chèn trọng tải dưới dạng Chuỗi trong lưới dữ liệu bằng cách sử dụng camel-jbossdatagridthành phần.

Lưu trữ Nhật ký

Có hai cấu hình chính cho lưới dữ liệu. Bạn có thể sử dụng nó trong chế độ Thư viện, nơi công cụ được nhúng trong cùng một JVM và cùng một heap được sử dụng để lưu trữ dữ liệu. Tùy chọn thứ hai có sẵn là chế độ Máy khách-Máy chủ. Nó được xây dựng dựa trên JBoss EAP và trong cấu hình này, engine và dữ liệu nằm trên một JVM riêng biệt với JVM ứng dụng.

Trong blog này, cấu hình chế độ Máy khách-Máy chủ sẽ được sử dụng để có được một cụm có quy mô theo chiều ngang và độc lập với tuyến. Nếu bạn chưa thiết lập Máy chủ lưới dữ liệu JBoss, bạn có thể theo dõi bài đăng trên blog của Red Hat Developers . Đối với trường hợp sử dụng cụ thể này, JBoss Data Grid Server phiên bản 6 là đủ.

Trước khi khởi động cụm Máy chủ Lưới Dữ liệu JBoss, bạn nên định cấu hình một bộ đệm ẩn cụ thể để lưu trữ các bản ghi dữ liệu. Bật chế độ tương thích cho phép chúng tôi truy vấn dữ liệu được lưu trữ bằng API REST từ bất kỳ trình duyệt hoặc ứng dụng khách REST nào như curl.

Để thêm cấu hình bộ đệm, bạn cần chỉnh sửa clustered.xmltệp nằm dưới  $JDG_HOME/standalone/configurationđường dẫn. Trong hệ thống con Infinispan, thêm các dòng cấu hình bộ đệm sau cấu hình bộ đệm mặc định.

<subsystem xmlns="urn:infinispan:server:core:6.4" default-cache-container="clustered">
    <cache-container name="clustered" default-cache="default" statistics="true">
    ...
        <distributed-cache name="logs" mode="ASYNC" segments="20" owners="2" remote-timeout="30000" start="EAGER">
            <locking acquire-timeout="30000" concurrency-level="1000" striping="false"/>
            <transaction mode="NONE"/>
            <compatibility enabled="true"/>
        </distributed-cache>
        ...
</subsystem>

Cấu hình trên cho phép bộ đệm ẩn được phân phối không đồng bộ (bạn có thể kiểm tra thêm về các chế độ được phân nhóm trong liên kết này ) được đặt tên logs. Bạn có thể kiểm tra các chi tiết cụ thể của cấu hình trong tài liệu JBoss Data Grid chính thức có sẵn trên cổng Red Hat.

Một trong những tính năng thú vị nhất của chế độ máy khách-máy chủ khi sử dụng là API REST được nhúng để đặt và truy xuất dữ liệu được lưu trữ. Nó mở ra khả năng sử dụng bất kỳ ứng dụng nào mà không quan tâm đến ngôn ngữ phát triển nếu ứng dụng đó hỗ trợ giao tiếp HTTP. Máy chủ lưới dữ liệu cũng bao gồm giao thức máy khách nhị phân TCP của riêng nó để kết nối với lưới. Nó được gọi là Hot Rod và là phần triển khai được sử dụng cho camel-datagridthành phần. Khi cờ tương thích được bật, bạn có thể đặt và truy xuất dữ liệu liền mạch với một trong hai API.

Để thêm camel-jbossdatagridthành phần, bạn cần thêm phần phụ thuộc Maven và chỉ định phiên bản JBoss Data Grid được sử dụng.

<dependency>
   <groupId>org.apache.camel</groupId>
   <artifactId>camel-jbossdatagrid</artifactId>
   <version>${jboss.datagrid.version}</version>
</dependency>

Việc sử dụng camel-jbossdatagridthành phần khá dễ dàng. Bạn chỉ cần định cấu hình khóa và giá trị làm tiêu đề thư. Sau đó, gọi trình sản xuất với hostname:portbất kỳ nút nào của cụm lưới dữ liệu và bộ nhớ đệm mong muốn để lưu trữ dữ liệu.

Đối với ví dụ này, chúng tôi sẽ sử dụng ID thông điệp Camel làm khóa và tải trọng thông báo (dưới dạng chuỗi) cho giá trị. Bộ nhớ đệm được sử dụng là bộ đệm được cấu hình trước đó logs.

<route>
    <from uri="direct:infinispan"/>
    <setHeader headerName="CamelInfinispanKey">
        <simple>${id}</simple>
    </setHeader>
    <setHeader headerName="CamelInfinispanValue">
        <simple>${bodyAs(String)}</simple>
    </setHeader>
    <to uri="infinispan://localhost?cacheName=logs"/>
</route>

Với lộ trình thứ hai này, dự án đã sẵn sàng chạy và bắt đầu thu thập nhật ký máy chủ lưới dữ liệu.

Chạy dự án

Điều đầu tiên cần làm là khởi động cụm lưới dữ liệu. Từ dòng lệnh bắt đầu phiên bản cụm của máy chủ chỉ định các cổng và tên nút để không gặp khó khăn khi chạy cụm trên cùng một máy.

Chạy node1 với port-offset 0:
$ ${JDG_HOME}/bin/clustered -Djboss.socket.binding.port-offset=0 -Djboss.node.name=node1

Chạy node2 với port-offset 1:
$ ${JDG_HOME}/bin/clustered -Djboss.socket.binding.port-offset=1 -Djboss.node.name=node2

Chạy node3 với port-offset 2:
$ ${JDG_HOME}/bin/clustered -Djboss.socket.binding.port-offset=2 -Djboss.node.name=node3

Lưu ý: Hãy nhớ mở các cổng UDP / TCP trong máy kiểm tra của bạn để các nút có thể tham gia vào cụm.

Sau khi bắt đầu cụm lưới dữ liệu, bạn có thể bắt đầu tuyến đường lạc đà bằng cách sử dụng camel-maven-plugin. Thêm các dòng sau để kích hoạt nó trong phần plugin. Nếu bạn đã tạo dự án từ nguyên mẫu Maven, nó có thể sẽ ở đó. Đừng quên chỉ định cùng một phiên bản mà bạn đang sử dụng Apache Camel.

<plugin>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-maven-plugin</artifactId>
    <version>${camel.version}</version>
    <configuration>
    <fileApplicationContextUri>src/main/resources/META-INF/spring/camel-context.xml</fileApplicationContextUri>
    </configuration>
</plugin>

Plugin này cho phép dự án chạy tuyến đường như một ứng dụng Java đơn giản mà không cần triển khai gói cho vùng chứa Java. Bằng cách này, bạn có thể chạy các tuyến Apache Camel từ dòng lệnh bằng lệnh này:

$ mvn clean camel:run

Lệnh trên sẽ khởi động Camel Context and Route để quét dòng tệp nhật ký máy chủ lưới dữ liệu bằng cách đưa thông điệp đã phân tích cú pháp vào bộ đệm ẩn lưới dữ liệu. Nếu bạn kiểm tra cẩn thận nhật ký hiển thị, bạn sẽ nhận thấy rằng thậm chí khó chỉ có nút đầu tiên của cụm được định cấu hình cho tuyến đường, giao thức Hot Rod nhận cấu trúc liên kết cụm thêm hai nút khác vào nhóm khách.

...
INFO Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@67692d1f: startup date [Tue Feb 28 13:19:23 CST 2017]; root of context hierarchy
INFO Loading XML bean definitions from file [/home/hguerrer/git/fuse-examples/logging-collector/src/main/resources/META-INF/spring/camel-context.xml]
INFO Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2edb5eba: defining beans [template,consumerTemplate,camel-1:beanPostProcessor,camel-1]; root of factory hierarchy
INFO Apache Camel 2.17.0.redhat-630224 (CamelContext: camel-1) is starting
INFO JMX is enabled
INFO Loaded 183 type converters
INFO Runtime endpoint registry is in extended mode gathering usage statistics of all incoming and outgoing endpoints (cache limit: 1000)
INFO AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance.
INFO StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
INFO ISPN004006: localhost/127.0.0.1:11222 sent new topology view (id=4, age=0) containing 3 addresses: [/127.0.0.1:11222, /127.0.0.1:11223, /127.0.0.1:11224]
INFO ISPN004014: New server added(/127.0.0.1:11223), adding to the pool.
INFO ISPN004014: New server added(/127.0.0.1:11224), adding to the pool.
INFO ISPN004021: Infinispan version: 6.4.1.Final-redhat-1
INFO Route: route1 started and consuming from: Endpoint[stream://file?fileName=%2Fopt%2FNotBackedUp%2Fjboss-datagrid-6.6.0-server%2Fstandalone%2Flog%2Fserver.log&scanStream=true]
INFO Route: route2 started and consuming from: Endpoint[direct://infinispan]
INFO Total 2 routes, of which 2 are started.
INFO Apache Camel 2.17.0.redhat-630224 (CamelContext: camel-1) started in 1.259 seconds
INFO ISPN004006: /127.0.0.1:11223 sent new topology view (id=4, age=0) containing 3 addresses: [/127.0.0.1:11222, /127.0.0.1:11223, /127.0.0.1:11224]

Bởi vì tuyến sử dụng thành phần Luồng, nó sẽ tiếp tục chạy khi chờ thêm dữ liệu đầu vào từ tệp được chỉ định. Nếu bạn muốn dừng con đường chỉ cần nhấn tổ hợp phím CTRL + C .

Cách dễ nhất để kiểm tra xem mọi thứ đã chạy tốt hay chưa và nhật ký đã được thu thập là truy vấn API REST của lưới dữ liệu. Bạn chỉ cần mở URL sau trên trình duyệt hoặc ứng dụng khách REST của mình:

http://localhost:8080/rest/logs/

Lưu ý: Đừng quên tạo người dùng có vai trò REST chính xác để bạn có thể xác thực với máy chủ. Không nên tắt bảo mật.

Bạn sẽ nhận được danh sách các khóa được liên kết với các thư được lưu trữ trong máy chủ. Tùy thuộc vào kích thước nhật ký, có thể mất một lúc để tải trang.

Triển khai Trình thu thập nhật ký bằng Cầu chì JBoss Mũ đỏ và Mũ đỏ JBoss ...

Nếu bạn nhấp vào bất kỳ liên kết nào, bạn sẽ có thể kiểm tra dữ liệu JSON.

Triển khai Trình thu thập nhật ký bằng Cầu chì JBoss Mũ đỏ và Mũ đỏ JBoss ...

Nếu bạn muốn kiểm tra thêm thông tin của máy chủ lưới dữ liệu, bạn có thể sử dụng Bảng điều khiển quản lý và giám sát Java (JConsole) để kiểm tra MBeans được hiển thị trên bất kỳ nút nào. Thống kê được bật theo mặc định.

Triển khai Trình thu thập nhật ký bằng Cầu chì JBoss Mũ đỏ và Mũ đỏ JBoss ...

Một số thống kê bạn có thể duyệt qua là numberOfEntriesvà  stores. Đầu tiên đề cập đến số lượng mục nhập trong bộ nhớ cache và thứ hai là tổng số hoạt động đặt. Bạn có thể kiểm tra các số liệu khác được hiển thị trong MBeans tại đây . Mỗi mục nhập đại diện cho một thông báo nhật ký được phân tích cú pháp.

Dữ liệu được thu thập được lưu giữ trong cụm lưới dữ liệu tự động cân bằng lại các mục nhập khi một nút gặp trục trặc cho đến khi tất cả các nút bị gỡ xuống. Bạn có thể định cấu hình bộ đệm ẩn để lưu nội dung bộ nhớ trong cơ sở dữ liệu của hệ thống tệp trong trường hợp khởi động lại toàn bộ cụm.

Bước tiếp theo

Mặc dù nó không hoàn chỉnh; bạn có thể kiểm tra tính linh hoạt của các giải pháp để giải quyết công việc đơn giản này. Trong các bài viết tiếp theo, tôi sẽ cố gắng hoàn thành quá trình đầy đủ bằng cách thêm các công cụ trực quan cần thiết để truy vấn và tìm kiếm dữ liệu được lưu trữ trong lưới. Một cách để thực hiện là sử dụng JBoss Data Virtualization để thực hiện một truy vấn từ xa trên lưới và trình bày dữ liệu bằng cách sử dụng bảng điều khiển đi kèm. Cách lâu dài là thử trình bao bọc OData cho chế độ Thư viện lưới dữ liệu JBoss và tạo nhà cung cấp OData cho Dashbuilder. Hãy theo dõi phần tiếp theo.

Tóm lược

JBoss Fuse và JBoss Data Grid là hai sản phẩm mạnh mẽ dựa trên các dự án cộng đồng phổ biến có thể được sử dụng để thu thập, phân tích cú pháp và lưu trữ nhật ký ứng dụng. Bạn có thể sử dụng kiến ​​thức Apache Camel của mình để tăng các trường hợp sử dụng của khung. 160+ bao gồm các thành phần JBoss Fuse cộng với bản thiết kế / Spring DSL; đơn giản hóa các nhiệm vụ tích hợp với sự phát triển mã gần như bằng không.

Nếu bạn muốn có đầy đủ chi tiết, bạn có thể kiểm tra mã hoàn chỉnh được phát triển trước đó từ repo GitHub của tôi .

19 hữu ích 0 bình luận 5.1k xem chia sẻ

Có thể bạn quan tâm

loading