This is an automated email from the ASF dual-hosted git repository.
gongchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/master by this push:
new 8e2ebe303 [test] add nginx collect test (#1809)
8e2ebe303 is described below
commit 8e2ebe3034f8ef1b9ef0cc90392f5d745ab41a74
Author: crossoverJie <[email protected]>
AuthorDate: Mon Apr 22 11:45:57 2024 +0800
[test] add nginx collect test (#1809)
Co-authored-by: tomsun28 <[email protected]>
---
.../collect/nginx/NginxCollectImplTest.java | 274 +++++++++++++++++++--
1 file changed, 256 insertions(+), 18 deletions(-)
diff --git
a/collector/src/test/java/org/apache/hertzbeat/collector/collect/nginx/NginxCollectImplTest.java
b/collector/src/test/java/org/apache/hertzbeat/collector/collect/nginx/NginxCollectImplTest.java
index 3f1d3c7fc..9443184d9 100644
---
a/collector/src/test/java/org/apache/hertzbeat/collector/collect/nginx/NginxCollectImplTest.java
+++
b/collector/src/test/java/org/apache/hertzbeat/collector/collect/nginx/NginxCollectImplTest.java
@@ -17,47 +17,285 @@
package org.apache.hertzbeat.collector.collect.nginx;
+import static
org.apache.hertzbeat.common.constants.CommonConstants.TYPE_STRING;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.apache.hertzbeat.collector.collect.common.http.CommonHttpClient;
import org.apache.hertzbeat.common.entity.job.Metrics;
import org.apache.hertzbeat.common.entity.job.protocol.NginxProtocol;
import org.apache.hertzbeat.common.entity.message.CollectRep;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.ProtocolVersion;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.message.BasicStatusLine;
+import org.apache.http.protocol.HttpContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
/**
* Test case for {@link NginxCollectImpl}
- *
*/
+@ExtendWith(MockitoExtension.class)
public class NginxCollectImplTest {
+
+ @InjectMocks
private NginxCollectImpl nginxCollect;
- private NginxProtocol nginxProtocol;
+
+ @Mock
+ private CloseableHttpClient client;
+
+ @Mock
+ private CloseableHttpResponse mockHttpResponse;
@BeforeEach
public void setup() {
- nginxCollect = new NginxCollectImpl();
- nginxProtocol = NginxProtocol.builder()
+ }
+
+
+ @Test
+ public void testNginxCollectFail() throws IOException {
+ NginxProtocol nginxProtocol = NginxProtocol.builder()
+ .host("127.0.0.1")
+ .port("8080")
+ .timeout("6000")
+ .url("/nginx-status")
+ .build();
+
+ try (MockedStatic<CommonHttpClient> mockStatic =
Mockito.mockStatic(CommonHttpClient.class)) {
+ mockStatic.when(() ->
CommonHttpClient.getHttpClient()).thenReturn(client);
+ Mockito.when(client.execute(Mockito.any(HttpUriRequest.class),
Mockito.any(HttpContext.class)))
+ .thenReturn(mockHttpResponse);
+
+ StatusLine statusLine = new BasicStatusLine(new
ProtocolVersion("http", 1, 1),
+ 500, "fail");
+
Mockito.when(mockHttpResponse.getStatusLine()).thenReturn(statusLine);
+ CollectRep.MetricsData.Builder builder =
CollectRep.MetricsData.newBuilder();
+ long monitorId = 999;
+ String app = "testNginx";
+ Metrics metrics = new Metrics();
+ metrics.setName("nginx_status");
+ metrics.setNginx(nginxProtocol);
+ nginxCollect.collect(builder, monitorId, app, metrics);
+ assertEquals(builder.getCode(), CollectRep.Code.FAIL);
+ }
+
+ }
+
+ @Test
+ public void testNginxStatusCollect() throws IOException {
+ NginxProtocol nginxProtocol = NginxProtocol.builder()
.host("127.0.0.1")
- .port("80")
+ .port("8080")
.timeout("6000")
.url("/nginx-status")
.build();
+
+ try (MockedStatic<CommonHttpClient> mockedStatic =
Mockito.mockStatic(CommonHttpClient.class)) {
+ mockedStatic.when(() ->
CommonHttpClient.getHttpClient()).thenReturn(client);
+
+ Mockito.when(client.execute(Mockito.any(HttpUriRequest.class),
Mockito.any(HttpContext.class)))
+ .thenReturn(mockHttpResponse);
+
+ StatusLine statusLine = new BasicStatusLine(new
ProtocolVersion("http", 1, 1),
+ 200, "OK");
+
Mockito.when(mockHttpResponse.getStatusLine()).thenReturn(statusLine);
+
+ String responseTemp = """
+ Active connections: %s\s
+ server accepts handled requests
+ 5 5 5\s
+ Reading: %s Writing: 1 Waiting: 1\s
+ """;
+ String connections = "2";
+ String reading = "1";
+ String response = String.format(responseTemp, connections,
reading);
+ HttpEntity entity = new CustomHttpEntity(response,
ContentType.create("text/plain", "UTF-8"));
+ Mockito.when(mockHttpResponse.getEntity()).thenReturn(entity);
+
+ CollectRep.MetricsData.Builder builder =
CollectRep.MetricsData.newBuilder();
+ long monitorId = 999;
+ String app = "testNginx";
+
+ Metrics metrics = new Metrics();
+ List<String> aliasField = new ArrayList<>();
+ aliasField.add("active");
+ aliasField.add("reading");
+
+ List<Metrics.Field> fields = new ArrayList<>();
+ fields.add(Metrics.Field.builder()
+ .field("active")
+ .type(TYPE_STRING)
+ .build());
+ fields.add(Metrics.Field.builder()
+ .field("reading")
+ .type(TYPE_STRING)
+ .build());
+
+ metrics.setAliasFields(aliasField);
+ metrics.setFields(fields);
+ metrics.setName("nginx_status");
+ metrics.setNginx(nginxProtocol);
+ nginxCollect.collect(builder, monitorId, app, metrics);
+ assertEquals(builder.getCode(), CollectRep.Code.SUCCESS);
+ for (CollectRep.ValueRow row : builder.getValuesList()) {
+ assertEquals(row.getColumnsCount(), 2);
+ assertEquals(row.getColumns(0), connections);
+ assertEquals(row.getColumns(1), reading);
+ }
+ }
}
@Test
- public void testNginxCollect() {
- CollectRep.MetricsData.Builder builder =
CollectRep.MetricsData.newBuilder();
- long monitorId = 999;
- String app = "testNginx";
-
- Metrics metrics = new Metrics();
- metrics.setNginx(nginxProtocol);
- nginxCollect.collect(builder, monitorId, app, metrics);
+ public void testNginxReqStatusCollect() throws IOException {
+ NginxProtocol nginxProtocol = NginxProtocol.builder()
+ .host("127.0.0.1")
+ .port("8080")
+ .timeout("6000")
+ .url("/req-status")
+ .build();
+
+ try (MockedStatic<CommonHttpClient> mockedStatic =
Mockito.mockStatic(CommonHttpClient.class)) {
+ mockedStatic.when(() ->
CommonHttpClient.getHttpClient()).thenReturn(client);
+
+ Mockito.when(client.execute(Mockito.any(HttpUriRequest.class),
Mockito.any(HttpContext.class)))
+ .thenReturn(mockHttpResponse);
+
+ StatusLine statusLine = new BasicStatusLine(new
ProtocolVersion("http", 1, 1),
+ 200, "OK");
+
Mockito.when(mockHttpResponse.getStatusLine()).thenReturn(statusLine);
+
+ String responseTemp = """
+ zone_name key max_active max_bw traffic
requests active bandwidth
+ imgstore_appid 43 27 6M 63G %s 0
%s
+ imgstore_appid 53 329 87M 2058G %s 50 %s
+ """;
+ String request0 = "374063";
+ String bandwidth0 = "0";
+ String request1 = "7870529";
+ String bandwidth1 = "25M";
+ String response = String.format(responseTemp, request0,
bandwidth0, request1, bandwidth1);
+ HttpEntity entity = new CustomHttpEntity(response,
ContentType.create("text/plain", "UTF-8"));
+ Mockito.when(mockHttpResponse.getEntity()).thenReturn(entity);
+
+ CollectRep.MetricsData.Builder builder =
CollectRep.MetricsData.newBuilder();
+ long monitorId = 999;
+ String app = "testNginx";
+
+ Metrics metrics = new Metrics();
+ List<String> aliasField = new ArrayList<>();
+ aliasField.add("requests");
+ aliasField.add("bandwidth");
+
+ List<Metrics.Field> fields = new ArrayList<>();
+ fields.add(Metrics.Field.builder()
+ .field("requests")
+ .type(TYPE_STRING)
+ .build());
+ fields.add(Metrics.Field.builder()
+ .field("bandwidth")
+ .type(TYPE_STRING)
+ .build());
+
+ metrics.setAliasFields(aliasField);
+ metrics.setFields(fields);
+ metrics.setName("req_status");
+ metrics.setNginx(nginxProtocol);
+ nginxCollect.collect(builder, monitorId, app, metrics);
+ assertEquals(builder.getCode(), CollectRep.Code.SUCCESS);
+ assertEquals(builder.getValuesCount(), 2);
+ for (int i = 0; i < builder.getValuesList().size(); i++) {
+ CollectRep.ValueRow row = builder.getValues(i);
+ assertEquals(row.getColumnsCount(), 2);
+ if (i == 0) {
+ assertEquals(row.getColumns(0), request0);
+ assertEquals(row.getColumns(1), bandwidth0);
+ } else {
+ assertEquals(row.getColumns(0), request1);
+ assertEquals(row.getColumns(1), bandwidth1);
+ }
+ }
+
+ }
+ }
+
+ static class CustomHttpEntity implements HttpEntity {
+
+ private final String content;
+ private final ContentType contentType;
+
+ public CustomHttpEntity(String content, ContentType contentType) {
+ this.content = content;
+ this.contentType = contentType;
+ }
+
+ @Override
+ public boolean isRepeatable() {
+ return true;
+ }
+
+ @Override
+ public boolean isChunked() {
+ return false;
+ }
+
+ @Override
+ public boolean isStreaming() {
+ return false;
+ }
+
+ @Override
+ public void consumeContent() {
+
+ }
+
+ @Override
+ public long getContentLength() {
+ return content.getBytes(contentType.getCharset()).length;
+ }
+
+ @Override
+ public InputStream getContent() {
+ return new
ByteArrayInputStream(content.getBytes(contentType.getCharset()));
+ }
+
+ @Override
+ public void writeTo(OutputStream outStream) throws IOException {
+ outStream.write(content.getBytes(contentType.getCharset()));
+ outStream.flush();
+ }
+
+ @Override
+ public Header getContentEncoding() {
+ return null;
+ }
+
+ @Override
+ public Header getContentType() {
+ return contentType != null ? new BasicHeader("Content-Type",
contentType.toString()) : null;
+ }
+
}
+
@Test
public void testNginxStatusMatch() {
String status = "Active connections: 2\n" +
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]