/
AntmediaAppender.java
111 lines (92 loc) · 3.62 KB
/
AntmediaAppender.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package io.antmedia.logger;
import java.io.IOException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.http.HttpHeaders;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.red5.server.Launcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.JsonObject;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxyUtil;
import ch.qos.logback.core.AppenderBase;
import io.antmedia.rest.RestServiceBase;
import io.antmedia.rest.model.Version;
import io.antmedia.statistic.StatsCollector;
/**
* Appender for logback in charge of sending the logged events to a Firebase analytic server.
*/
public class AntmediaAppender extends AppenderBase<ILoggingEvent> {
protected static final Logger logger = LoggerFactory.getLogger(AntmediaAppender.class);
private static ExecutorService executor = Executors.newSingleThreadExecutor();
@Override
public void append(ILoggingEvent iLoggingEvent) {
if (LoggerEnvironment.isManagingThread()) {
return;
}
LoggerEnvironment.startManagingThread();
try {
IThrowableProxy throwbleProxy = iLoggingEvent.getThrowableProxy();
if (throwbleProxy != null) {
sendErrorToAnalytic(throwbleProxy);
}
} catch (Exception e) {
addError("An exception occurred", e);
} finally {
LoggerEnvironment.stopManagingThread();
}
}
@Override
public void stop() {
LoggerEnvironment.startManagingThread();
try {
if (!isStarted()) {
return;
}
super.stop();
} catch (Exception e) {
addError("An exception occurred", e);
} finally {
LoggerEnvironment.stopManagingThread();
}
}
public void sendErrorToAnalytic(IThrowableProxy throwbleProxy) {
executor.submit(() ->
{
String errorDetail = ThrowableProxyUtil.asString(throwbleProxy);
String instanceId = Launcher.getInstanceId();
JsonObject instance = new JsonObject();
instance.addProperty(StatsCollector.INSTANCE_ID, instanceId);
instance.addProperty("errorDetail", errorDetail);
Version softwareVersion = RestServiceBase.getSoftwareVersion();
instance.addProperty("versionName", softwareVersion.getVersionName());
instance.addProperty("versionType", softwareVersion.getVersionType());
instance.addProperty("versionBuild", softwareVersion.getBuildNumber());
try (CloseableHttpClient client = getHttpClient())
{
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(2 * 1000).setSocketTimeout(5*1000).build();
HttpRequestBase post = (HttpRequestBase)RequestBuilder.post().setUri("https://us-central1-ant-media-server-analytics.cloudfunctions.net/sendErrorDetail")
.setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.setEntity(new StringEntity(instance.toString())).build();
post.setConfig(requestConfig);
client.execute(post);
}catch (IOException e) {
logger.error("Couldn't connect Ant Media Server Analytics: {} " , ExceptionUtils.getStackTrace(e) );
}
});
}
public static CloseableHttpClient getHttpClient() {
return HttpClients.custom().setRedirectStrategy(new LaxRedirectStrategy()).build();
}
}