Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 0 additions & 153 deletions backend/src/main/java/com/park/utmstack/domain/ip_info/GeoIp.java

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@

public class RequestDsl {
private static final String CLASSNAME = "RequestDsl";
public static final String GEO_HIT_AGG = "_geo_hit";
public static final List<String> GEO_SOURCE_INCLUDES = List.of(
"origin.geolocation.latitude", "origin.geolocation.longitude",
"source.geolocation.latitude", "source.geolocation.longitude",
"destination.geolocation.latitude", "destination.geolocation.longitude");
private final SearchRequest.Builder searchRequestBuilder;
private final UtmVisualization visualization;

Expand Down Expand Up @@ -130,6 +135,14 @@ private void buildAggregation() throws UtmElasticsearchException {
Map<String, Aggregation.Builder.ContainerBuilder> bucketAggregations = buildBucketAggregation(bucket);
Map<String, Aggregation> metricAggregations = buildMetricAggregation(metrics);

if (visualization.getChartType() == ChartType.COORDINATE_MAP_CHART) {
Map<String, Aggregation> withGeo = new LinkedHashMap<>(metricAggregations);
withGeo.put(GEO_HIT_AGG, Aggregation.of(a -> a.topHits(th -> th
.size(1)
.source(s -> s.filter(f -> f.includes(GEO_SOURCE_INCLUDES))))));
metricAggregations = withGeo;
}

if (!CollectionUtils.isEmpty(bucketAggregations)) {
Map<String, Aggregation> root = new LinkedHashMap<>();
if (bucketAggregations.size() > 1) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package com.park.utmstack.util.chart_builder.elasticsearch_dsl.responses.impl.coordinate_map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.park.utmstack.domain.chart_builder.UtmVisualization;
import com.park.utmstack.domain.chart_builder.types.aggregation.AggregationType;
import com.park.utmstack.domain.chart_builder.types.aggregation.Bucket;
import com.park.utmstack.domain.chart_builder.types.aggregation.Metric;
import com.park.utmstack.domain.ip_info.GeoIp;
import com.park.utmstack.service.ip_info.IpInfoService;
import com.park.utmstack.util.chart_builder.elasticsearch_dsl.requests.RequestDsl;
import com.park.utmstack.util.chart_builder.elasticsearch_dsl.responses.ResponseParser;
import com.park.utmstack.util.exceptions.UtmIpInfoException;
import com.utmstack.opensearch_connector.parsers.TermAggregateParser;
import com.utmstack.opensearch_connector.types.BucketAggregation;
import com.utmstack.opensearch_connector.types.SearchSqlResponse;
import org.opensearch.client.opensearch._types.aggregations.Aggregate;
import org.opensearch.client.opensearch._types.aggregations.TopHitsAggregate;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -27,15 +28,10 @@
@Component
public class ResponseParserForCoordinateMapChart implements ResponseParser<CoordinateMapChartResult> {
private static final String CLASSNAME = "ResponseParserForCoordinateMapChart";
private static final List<String> GEO_PREFIXES = List.of("origin", "source", "destination");

private final Logger log = LoggerFactory.getLogger(ResponseParserForCoordinateMapChart.class);

private final IpInfoService ipInfoService;

public ResponseParserForCoordinateMapChart(IpInfoService ipInfoService) {
this.ipInfoService = ipInfoService;
}

@Override
public List<CoordinateMapChartResult> parse(UtmVisualization visualization, SearchResponse<ObjectNode> result) {
final String ctx = CLASSNAME + ".parse";
Expand All @@ -53,20 +49,13 @@ public List<CoordinateMapChartResult> parse(UtmVisualization visualization, Sear


for (BucketAggregation entry : entries) {
GeoIp ipV4Info;
try {
ipV4Info = ipInfoService.getIpInfo(entry.getKey());

if (ipV4Info == null)
continue;
} catch (UtmIpInfoException e) {
log.error(e.getMessage());
Double[] latLon = extractLatLongFromTopHits(entry.getSubAggregations());
if (latLon == null)
continue;
}

CoordinateMapChartResult value = new CoordinateMapChartResult();
value.setName(entry.getKey());
value.addLatitude(ipV4Info.getLatitude()).addLongitude(ipV4Info.getLongitude());
value.addLatitude(latLon[0]).addLongitude(latLon[1]);

switch (metric.getAggregation()) {
case COUNT:
Expand Down Expand Up @@ -140,20 +129,14 @@ public List<CoordinateMapChartResult> parse(UtmVisualization visualization, Sear
}
if (!StringUtils.hasText(ip)) continue;

GeoIp ipInfo;
try {
ipInfo = ipInfoService.getIpInfo(ip);
if (ipInfo == null) continue;
} catch (UtmIpInfoException e) {
log.error(e.getMessage());
continue;
}
Double[] latLon = extractLatLongFromRow(row);
if (latLon == null) continue;

CoordinateMapChartResult chartResult = new CoordinateMapChartResult();
chartResult.setName(ip);
chartResult.setValue(new Double[] {
ipInfo.getLatitude(),
ipInfo.getLongitude(),
latLon[0],
latLon[1],
(double) i
});

Expand All @@ -165,4 +148,59 @@ public List<CoordinateMapChartResult> parse(UtmVisualization visualization, Sear
throw new RuntimeException(ctx + ": " + e.getMessage(), e);
}
}

private Double[] extractLatLongFromTopHits(Map<String, Aggregate> subAggs) {
if (subAggs == null) return null;
Aggregate geoAgg = subAggs.get(RequestDsl.GEO_HIT_AGG);
if (geoAgg == null || !geoAgg.isTopHits()) return null;
TopHitsAggregate topHits = geoAgg.topHits();
if (topHits.hits() == null || topHits.hits().hits().isEmpty()) return null;
var hit = topHits.hits().hits().get(0);
if (hit.source() == null) return null;
try {
ObjectNode source = hit.source().to(ObjectNode.class);
return extractLatLongFromJson(source);
} catch (Exception e) {
log.warn("Failed to deserialize top_hits source for geolocation: {}", e.getMessage());
return null;
}
}

private Double[] extractLatLongFromJson(ObjectNode source) {
if (source == null) return null;
for (String prefix : GEO_PREFIXES) {
JsonNode geo = source.path(prefix).path("geolocation");
JsonNode lat = geo.path("latitude");
JsonNode lon = geo.path("longitude");
if (lat.isNumber() && lon.isNumber()) {
return new Double[]{lat.asDouble(), lon.asDouble()};
}
}
return null;
}

private Double[] extractLatLongFromRow(Map<String, Object> row) {
Double lat = null;
Double lon = null;
for (Map.Entry<String, Object> e : row.entrySet()) {
if (e.getValue() == null) continue;
String key = e.getKey();
if (lat == null && (key.endsWith(".geolocation.latitude") || key.equals("latitude"))) {
lat = toDouble(e.getValue());
} else if (lon == null && (key.endsWith(".geolocation.longitude") || key.equals("longitude"))) {
lon = toDouble(e.getValue());
}
}
if (lat == null || lon == null) return null;
return new Double[]{lat, lon};
}

private Double toDouble(Object val) {
if (val instanceof Number) return ((Number) val).doubleValue();
try {
return Double.parseDouble(val.toString());
} catch (NumberFormatException e) {
return null;
}
}
}
2 changes: 0 additions & 2 deletions backend/src/main/resources/config/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@ jhipster:
base-url:

application:
chart-builder: # Chart builder configuration
ip-info-index-name: .utm-geoip
incident-response:
asset-verification-interval: 300

Expand Down
Loading