grpc
를 이용하여 전달한다IstioOperator
리소스에 아래 설정 추가spec:
meshConfig:
accessLogFile: /dev/stdout
accessLogEncoding: JSON
enableEnvoyAccessLogService: true
defaultConfig:
envoyAccessLogService:
address: <endpoint>
endpoint
에는 access log를 grpc로 전달 받을 서버의 주소를 적는다istio
configmap
에 아래 설정 추가data:
...
mesh: |-
accessLogFile: /dev/stdout
accessLogEncoding: JSON
enableEnvoyAccessLogService: true
defaultConfig:
envoyAccessLogService:
address: <endpoint>
endpoint
에는 access log를 grpc로 전달 받을 서버의 주소를 적는다io.envoyproxy.controlplane:server
라이브러리를 활용하여 아래와 같이 구현 가능...
import io.envoyproxy.envoy.data.accesslog.v3.HTTPAccessLogEntry;
import io.envoyproxy.envoy.service.accesslog.v3.AccessLogServiceGrpc;
import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsMessage;
import io.envoyproxy.envoy.service.accesslog.v3.StreamAccessLogsResponse;
import io.grpc.stub.StreamObserver;
...
@Slf4j
@AllArgsConstructor
@GrpcService
public class IstioAccessLogService extends AccessLogServiceGrpc.AccessLogServiceImplBase {
@Override
public StreamObserver<StreamAccessLogsMessage> streamAccessLogs(
StreamObserver<StreamAccessLogsResponse> responseObserver) {
return new StreamObserver<>() {
private volatile boolean ingressEnvoy = false;
@Override
public void onNext(StreamAccessLogsMessage message) {
List<HTTPAccessLogEntry> logEntries = message.getHttpLogs().getLogEntryList();
for (HTTPAccessLogEntry logEntry : logEntries) {
...
}
}
@Override
public void onError(Throwable t) {
responseObserver.onError(t);
}
@Override
public void onCompleted() {
responseObserver.onCompleted();
}
};
}
}
endpoint
로 전송하게 된다
StreamAccessLogsMessage.getIdentifier().getNode().getCluster();
istio-system
네임스페이스에서 전달된 것만 수집해도 충분하지 않을까 싶다