96 lines
3.8 KiB
Markdown
96 lines
3.8 KiB
Markdown
# Spring Gateway Plugin
|
|
|
|
Spring Gateway Plugin only support Spring Gateway 2.x, 3.x and 4.x. It has capabilities to create entry spans for
|
|
incoming calls, continue tracing context propagation in Spring Gateway and create exit spans for outgoing calls.
|
|
|
|
About the filter extension of Gateway, it provides automatically support as much as possible, including GlobalFilter and GatewayFilter
|
|
support. However, the filter extension by using `chain.filter(exchange).then(...)` is not able to transparently.
|
|
|
|
## Supported Auto-Instrument Filters
|
|
|
|
```java
|
|
@Component
|
|
public class Filter1 implements GlobalFilter, Ordered {
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(Filter1.class);
|
|
@Override
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
// Available trace context
|
|
// For log framework integration(trace context log output) and manual trace context usage.
|
|
String traceId = TraceContext.traceId();
|
|
log.info("available traceId: {}", traceId);
|
|
|
|
String segmentId = TraceContext.segmentId();
|
|
log.info("available segmentId: {}", segmentId);
|
|
|
|
int spanId = TraceContext.spanId();
|
|
log.info("available spanId: {}", spanId);
|
|
|
|
return chain.filter(exchange);
|
|
}
|
|
@Override
|
|
public int getOrder() {
|
|
return -100;
|
|
}
|
|
}
|
|
```
|
|
```java
|
|
@Component
|
|
public class GatewayFilter1 implements GatewayFilter {
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(GatewayFilter1.class);
|
|
@Override
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
// Available trace context
|
|
log.info("gatewayFilter1 running");
|
|
return chain.filter(exchange);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Unsupported Auto-Instrument Filters
|
|
Typically, in the following case, you need to read via [Webflux Tracing Assistant APIs](../Application-toolkit-webflux.md) to get the trace context.
|
|
|
|
```java
|
|
@Component
|
|
public class UnsupportedFilter implements GlobalFilter, Ordered {
|
|
private static final Logger log = LoggerFactory.getLogger(UnsupportedFilter.class);
|
|
@Override
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
String traceId = TraceContext.traceId();
|
|
// Trace ID is available as it's in the GlobalFilter.
|
|
log.info("available traceId: {}", traceId);
|
|
|
|
String segmentId = TraceContext.segmentId();
|
|
// Segment ID is available as it's in the GlobalFilter.
|
|
log.info("available segmentId: {}", segmentId);
|
|
|
|
int spanId = TraceContext.spanId();
|
|
// Span ID is available as it's in the GlobalFilter.
|
|
log.info("available spanId: {}", spanId);
|
|
|
|
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
|
|
// Trace ID/context is not available, N/A in the all following logs.
|
|
// The trace context is not available in the then-closure.
|
|
// Only webflux assistant API can get the trace context.
|
|
String traceId2 = WebFluxSkyWalkingTraceContext.traceId(exchange);
|
|
// Trace ID is not available, N/A in the logs.
|
|
log.info("unavailable in then-closure, available traceId: {} through webflux assistant API", traceId2);
|
|
|
|
String segmentId2 = WebFluxSkyWalkingTraceContext.segmentId(exchange);
|
|
// Segment ID is not available, N/A in the logs.
|
|
log.info("unavailable in then-closure, available segmentId: {} through webflux assistant API", segmentId2);
|
|
|
|
int spanId2 = WebFluxSkyWalkingTraceContext.spanId(exchange);
|
|
// Span ID is not available, N/A in the logs.
|
|
log.info("unavailable in then-closure, available spanId: {} through webflux assistant API", spanId2);
|
|
}));
|
|
}
|
|
|
|
@Override
|
|
public int getOrder() {
|
|
return 10;
|
|
}
|
|
}
|
|
|
|
``` |