Skip to content

Commit d8b7904

Browse files
authored
Merge pull request #851 from utmstack/bugfix/v10.5.9/timezone-setting-not-applied-to-views
Bugfix/v10.5.9/timezone setting not applied to views
2 parents bc9dbac + 0800419 commit d8b7904

File tree

10 files changed

+39
-31
lines changed

10 files changed

+39
-31
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
# UTMStack 10.5.9 Release Notes
1+
# UTMStack 10.5.10 Release Notes
22
## Bugfix
3-
- The fix ensures that the correct GMT offset is now included when showing timezones, providing more accurate information to the user.
3+
- Improved timezone handling for Data Source -> Last Input and Log Explorer views
4+
- Implemented a check to assign 'UNKNOWN' as the default key for buckets with empty keys to ensure data consistency.

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/impl/bar_chart/ResponseParserForBarChart.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ private void parseBuckets(Bucket bucket, Map<String, Aggregate> aggregations, Li
106106
if (CollectionUtils.isEmpty(_buckets))
107107
return;
108108
for (BucketAggregation _bucket : _buckets) {
109+
if(_bucket.getKey().isEmpty()){
110+
_bucket.setKey("UNKNOWN");
111+
}
109112
if (bucket.getType().equals(BucketType.AXIS))
110113
retValue.addCategory(_bucket.getKey());
111114
keys.add(_bucket.getKey());

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/impl/metric_chart/ResponseParserForMetricChart.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ private List<MetricChartResult> parseTermAggregation(Map<String, Aggregate> resu
8181

8282
for (Metric metric : metrics) {
8383
for (BucketAggregation _bucket : _buckets) {
84+
if(_bucket.getKey().isEmpty()){
85+
_bucket.setKey("UNKNOWN");
86+
}
8487
switch (metric.getAggregation()) {
8588
case AVERAGE:
8689
AvgAggregate avg = _bucket.getSubAggregations().get(metric.getId()).avg();

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/impl/pie_chart/ResponseParserForPieChart.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ private List<PieChartResult> parseTermAggregation(Map<String, Aggregate> result,
8383
List<PieChartResult> _return = new ArrayList<>();
8484

8585
for (BucketAggregation _bucket : _buckets) {
86+
if(_bucket.getKey().isEmpty()){
87+
_bucket.setKey("UNKNOWN");
88+
}
8689
switch (metric.getAggregation()) {
8790
case AVERAGE:
8891
AvgAggregate avg = _bucket.getSubAggregations().get(metric.getId()).avg();

backend/src/main/java/com/park/utmstack/util/chart_builder/elasticsearch_dsl/responses/impl/table_chart/ResponseParserForTableChart.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ private void parseBuckets(Bucket bucket, Map<String, Aggregate> aggregations, Li
8585
if (CollectionUtils.isEmpty(_buckets))
8686
return;
8787
for (BucketAggregation _bucket : _buckets) {
88-
rowCells.add(new TableChartResult.Cell<>(_bucket.getKey(), false));
88+
rowCells.add(new TableChartResult.Cell<>(!_bucket.getKey().isEmpty() ? _bucket.getKey() : "UNKNOWN", false));
8989
parseBuckets(bucket.getSubBucket(), _bucket.getSubAggregations(), metrics, _bucket);
9090
}
9191
} else {

frontend/src/app/assets-discover/assets-discover.module.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {FormsModule, ReactiveFormsModule} from '@angular/forms';
44
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
55
import {NgSelectModule} from '@ng-select/ng-select';
66
import {ResizableModule} from 'angular-resizable-element';
7+
import {InlineSVGModule} from 'ng-inline-svg';
78
import {NgxEchartsModule} from 'ngx-echarts';
89
import {InfiniteScrollModule} from 'ngx-infinite-scroll';
910
import {IncidentResponseSharedModule} from '../incident-response/shared/incident-response-shared.module';
@@ -15,12 +16,13 @@ import {AssetGroupDetailComponent} from './asset-groups/shared/components/asset-
1516
import {AssetGroupMetricsComponent} from './asset-groups/shared/components/asset-group-metrics/asset-group-metrics.component';
1617
import {AssetsDiscoverRoutingModule} from './assets-discover-routing.module';
1718
import {AssetsViewComponent} from './assets-view/assets-view.component';
19+
import {CollectorsViewComponent} from './collectors-view/collectors-view.component';
1820
import {AssetByGroupComponent} from './shared/components/asset-by-group/asset-by-group.component';
1921
import {AssetCreateComponent} from './shared/components/asset-create/asset-create.component';
2022
import {AssetDetailComponent} from './shared/components/asset-detail/asset-detail.component';
2123
import {AssetEditAliasComponent} from './shared/components/asset-edit-alias/asset-edit-alias.component';
2224
import {AssetFieldRenderComponent} from './shared/components/asset-field-render/asset-field-render.component';
23-
import {AssetGroupAddComponent} from './shared/components/asset-group-add/asset-group-add.component';
25+
import {AssetsGroupAddModule} from './shared/components/asset-group-add/assets-group-add.module';
2426
import {AssetIpComponent} from './shared/components/asset-ip/asset-ip.component';
2527
import {AssetIsAliveComponent} from './shared/components/asset-is-alive/asset-is-alive.component';
2628
import {AssetMetricsComponent} from './shared/components/asset-metrics/asset-metrics.component';
@@ -33,21 +35,17 @@ import {AssetSoftwareSelectComponent} from './shared/components/asset-software-s
3335
import {AssetSoftwaresComponent} from './shared/components/asset-softwares/asset-softwares.component';
3436
import {AssetStatusComponent} from './shared/components/asset-status/asset-status.component';
3537
import {AssetViewHelpComponent} from './shared/components/asset-view-help/asset-view-help.component';
36-
import {AssetsApplyNoteComponent} from './shared/components/assets-apply-note/assets-apply-note.component';
37-
import {AssetsApplyTypeComponent} from './shared/components/assets-apply-type/assets-apply-type.component';
38+
import {AssetsApplyNoteModule} from './shared/components/assets-apply-note/assets-apply-note.module';
39+
import {AssetsApplyTypeModule} from './shared/components/assets-apply-type/assets-apply-type.module';
3840
import {AssetsPortsComponent} from './shared/components/assets-ports/assets-ports.component';
41+
import {CollectorStatusComponent} from './shared/components/collector-status/collector-status.component';
3942
import {AssetActiveFilterComponent} from './shared/components/filters/asset-active-filter/asset-active-filter.component';
4043
import {AssetFilterApplyingComponent} from './shared/components/filters/asset-filter-applying/asset-filter-applying.component';
4144
import {AssetFilterIsAliveComponent} from './shared/components/filters/asset-filter-is-alive/asset-filter-is-alive.component';
4245
import {AssetGenericFilterComponent} from './shared/components/filters/asset-generic-filter/asset-generic-filter.component';
4346
import {AssetsFilterComponent} from './shared/components/filters/assets-filter/assets-filter.component';
4447
import {SourceDataTypeConfigComponent} from './source-data-type-config/source-data-type-config.component';
45-
import {AssetsApplyTypeModule} from './shared/components/assets-apply-type/assets-apply-type.module';
46-
import {AssetsApplyNoteModule} from './shared/components/assets-apply-note/assets-apply-note.module';
47-
import {AssetsGroupAddModule} from './shared/components/asset-group-add/assets-group-add.module';
48-
import {InlineSVGModule} from 'ng-inline-svg';
49-
import {CollectorsViewComponent} from "./collectors-view/collectors-view.component";
50-
import {CollectorStatusComponent} from "./shared/components/collector-status/collector-status.component";
48+
import {UtmDatePipe} from "../shared/pipes/date.pipe";
5149

5250
@NgModule({
5351
declarations: [
@@ -111,6 +109,9 @@ import {CollectorStatusComponent} from "./shared/components/collector-status/col
111109
AssetsGroupAddModule,
112110
InlineSVGModule
113111
],
112+
providers: [
113+
UtmDatePipe
114+
],
114115
schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA]
115116
})
116117
export class AssetsDiscoverModule {

frontend/src/app/assets-discover/assets-view/assets-view.component.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {SortEvent} from '../../shared/directives/sortable/type/sort-event';
1313
import {ChartValueSeparator} from '../../shared/enums/chart-value-separator';
1414
import {ElasticOperatorsEnum} from '../../shared/enums/elastic-operators.enum';
1515
import {IncidentOriginTypeEnum} from '../../shared/enums/incident-response/incident-origin-type.enum';
16+
import {UtmDatePipe} from '../../shared/pipes/date.pipe';
1617
import {IncidentCommandType} from '../../shared/types/incident/incident-command.type';
1718
import {UtmFieldType} from '../../shared/types/table/utm-field.type';
1819
import {TimeFilterType} from '../../shared/types/time-filter.type';
@@ -82,7 +83,8 @@ export class AssetsViewComponent implements OnInit, OnDestroy {
8283
private router: Router,
8384
private spinner: NgxSpinnerService,
8485
private accountService: AccountService,
85-
private assetFiltersBehavior: AssetFiltersBehavior) {
86+
private assetFiltersBehavior: AssetFiltersBehavior,
87+
private datePipe: UtmDatePipe) {
8688
}
8789

8890
// Init get asset on time filter component trigger
@@ -309,7 +311,7 @@ export class AssetsViewComponent implements OnInit, OnDestroy {
309311
getLastInput(asset: NetScanType) {
310312
if (asset.dataInputList.length > 0) {
311313
const lastInput = asset.dataInputList.sort((a, b) => a.timestamp > b.timestamp ? 1 : -1)[0].timestamp;
312-
return this.formatTimestampToDate(lastInput);
314+
return this.datePipe.transform(this.formatTimestampToDate(lastInput));
313315
} else {
314316
return 'Unknown';
315317
}

frontend/src/app/log-analyzer/explorer/log-analyzer-view/log-analyzer-view.component.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@
7777
<span class="font-weight-light"><i class="icon-list2"></i>&nbsp;{{totalItems}} records</span>
7878
</div>
7979
<div class="d-flex span-small-icon">
80-
<span class="font-weight-light"><i class="icon-earth"></i>&nbsp;Display Time ({{dateFormat.timezone}}
81-
)</span>
80+
<span *ngIf="dateFormat$ | async as dateFormat" class="font-weight-light"><i class="icon-earth"></i>&nbsp;Display Time ({{ dateFormat.timezone }})</span>
8281
</div>
8382
</div>
8483

frontend/src/app/log-analyzer/explorer/log-analyzer-view/log-analyzer-view.component.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {ActivatedRoute} from '@angular/router';
44
import {NgbModal} from '@ng-bootstrap/ng-bootstrap';
55
import {ResizeEvent} from 'angular-resizable-element';
66
import * as moment from 'moment';
7+
import {Observable} from 'rxjs';
78
import {UtmToastService} from '../../../shared/alert/utm-toast.service';
89
import {ElasticFilterDefaultTime} from '../../../shared/components/utm/filters/elastic-filter-time/elastic-filter-time.component';
910
import {UtmFilterBehavior} from '../../../shared/components/utm/filters/utm-elastic-filter/shared/behavior/utm-filter.behavior';
@@ -16,7 +17,6 @@ import {ElasticOperatorsEnum} from '../../../shared/enums/elastic-operators.enum
1617
import {DataNatureTypeEnum, NatureDataPrefixEnum} from '../../../shared/enums/nature-data.enum';
1718
import {ElasticDataExportService} from '../../../shared/services/elasticsearch/elastic-data-export.service';
1819
import {ElasticDataService} from '../../../shared/services/elasticsearch/elastic-data.service';
19-
import {ElasticSearchIndexService} from '../../../shared/services/elasticsearch/elasticsearch-index.service';
2020
import {TimezoneFormatService} from '../../../shared/services/utm-timezone.service';
2121
import {DatePipeDefaultOptions} from '../../../shared/types/date-pipe-default-options';
2222
import {ElasticSearchFieldInfoType} from '../../../shared/types/elasticsearch/elastic-search-field-info.type';
@@ -25,7 +25,6 @@ import {UtmIndexPattern} from '../../../shared/types/index-pattern/utm-index-pat
2525
import {UtmFieldType} from '../../../shared/types/table/utm-field.type';
2626
import {parseQueryParamsToFilter} from '../../../shared/util/query-params-to-filter.util';
2727
import {LogAnalyzerQueryCreateComponent} from '../../queries/log-analyzer-query-create/log-analyzer-query-create.component';
28-
import {DataSortBehavior} from '../../shared/behaviors/data-sort.behavior';
2928
import {IndexFieldController} from '../../shared/behaviors/index-field-controller.behavior';
3029
import {IndexPatternBehavior} from '../../shared/behaviors/index-pattern.behavior';
3130
import {LogFilterBehavior} from '../../shared/behaviors/log-filter.behavior';
@@ -67,19 +66,17 @@ export class LogAnalyzerViewComponent implements OnInit, OnDestroy {
6766
patterns: UtmIndexPattern[];
6867
paramLoaded = false;
6968
defaultTime: ElasticFilterDefaultTime = new ElasticFilterDefaultTime('now-24h', 'now');
70-
dateFormat: DatePipeDefaultOptions;
69+
dateFormat$: Observable<DatePipeDefaultOptions>;
7170

7271
constructor(private indexPatternBehavior: IndexPatternBehavior,
7372
private logAnalyzerService: ElasticDataService,
74-
private indexPatternFieldService: ElasticSearchIndexService,
7573
private indexFieldController: IndexFieldController,
7674
private modalService: NgbModal,
7775
private queryRunBehavior: QueryRunBehavior,
7876
private activatedRoute: ActivatedRoute,
7977
private utmToastService: UtmToastService,
8078
private utmFilterBehavior: UtmFilterBehavior,
8179
private elasticDataExportService: ElasticDataExportService,
82-
private dataSortBehavior: DataSortBehavior,
8380
private timezoneFormatService: TimezoneFormatService,
8481
private logFilterBehavior: LogFilterBehavior) {
8582
this.detailWidth = (this.pageWidth - 310);
@@ -98,15 +95,6 @@ export class LogAnalyzerViewComponent implements OnInit, OnDestroy {
9895
}
9996
}
10097
});
101-
this.timezoneFormatService.getDateFormatSubject().subscribe(format => {
102-
this.dateFormat = format;
103-
});
104-
}
105-
106-
ngOnDestroy(): void {
107-
this.filters = [];
108-
this.utmFilterBehavior.$filterChange.next(null);
109-
this.utmFilterBehavior.$filterExistChange.next(null);
11098
}
11199

112100
ngOnInit() {
@@ -117,6 +105,8 @@ export class LogAnalyzerViewComponent implements OnInit, OnDestroy {
117105
} else {
118106
this.initExplorer();
119107
}
108+
109+
this.dateFormat$ = this.timezoneFormatService.getDateFormatSubject();
120110
}
121111

122112
initExplorer() {
@@ -338,4 +328,10 @@ export class LogAnalyzerViewComponent implements OnInit, OnDestroy {
338328
this.fieldWidth = $event.rectangle.width + 'px';
339329
}
340330
}
331+
332+
ngOnDestroy(): void {
333+
this.filters = [];
334+
this.utmFilterBehavior.$filterChange.next(null);
335+
this.utmFilterBehavior.$filterExistChange.next(null);
336+
}
341337
}

version.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version: 10.5.9
1+
version: 10.5.10

0 commit comments

Comments
 (0)