From 9e59cbb27d0ac3b109559051128f6aee925dfb9f Mon Sep 17 00:00:00 2001 From: Kenzie Davisson <43759233+kenzieschmoll@users.noreply.github.com> Date: Wed, 9 Oct 2024 16:14:21 -0700 Subject: [PATCH] Include log metadata in logs table. (#8419) --- .../lib/src/screens/logging/_kind_column.dart | 68 ----- .../lib/src/screens/logging/_log_details.dart | 1 + .../lib/src/screens/logging/_logs_table.dart | 24 +- .../src/screens/logging/_message_column.dart | 121 +++++---- .../lib/src/screens/logging/_when_column.dart | 2 +- .../screens/logging/logging_controller.dart | 13 +- .../src/screens/logging/logging_screen.dart | 1 + .../logging_screen_v2/logging_table_row.dart | 51 +++- .../lib/src/screens/logging/metadata.dart | 238 +++++++++++++----- .../lib/src/shared/table/_flat_table.dart | 6 +- .../lib/src/shared/table/table.dart | 1 + .../release_notes/NEXT_RELEASE_NOTES.md | 6 + .../release_notes/images/log_metadata.png | Bin 0 -> 108047 bytes .../logging_table_row_test.dart | 3 + .../test/logging/metadata_test.dart | 90 +++++++ .../goldens/logging/metadata_chips.png | Bin 0 -> 13018 bytes .../lib/src/utils/serialization.dart | 3 +- 17 files changed, 414 insertions(+), 214 deletions(-) delete mode 100644 packages/devtools_app/lib/src/screens/logging/_kind_column.dart create mode 100644 packages/devtools_app/release_notes/images/log_metadata.png create mode 100644 packages/devtools_app/test/logging/metadata_test.dart create mode 100644 packages/devtools_app/test_infra/goldens/logging/metadata_chips.png diff --git a/packages/devtools_app/lib/src/screens/logging/_kind_column.dart b/packages/devtools_app/lib/src/screens/logging/_kind_column.dart deleted file mode 100644 index aa832ca71f3..00000000000 --- a/packages/devtools_app/lib/src/screens/logging/_kind_column.dart +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:devtools_app_shared/service.dart' show FlutterEvent; -import 'package:devtools_app_shared/ui.dart'; -import 'package:flutter/material.dart'; - -import '../../shared/primitives/utils.dart'; -import '../../shared/table/table.dart'; -import '../../shared/table/table_data.dart'; -import 'logging_controller.dart'; - -class KindColumn extends ColumnData - implements ColumnRenderer { - KindColumn() - : super( - 'Kind', - fixedWidthPx: scaleByFontFactor(155), - ); - - @override - bool get supportsSorting => false; - - @override - String getValue(LogData dataObject) => dataObject.kind; - - @override - Widget build( - BuildContext context, - LogData item, { - bool isRowSelected = false, - bool isRowHovered = false, - VoidCallback? onPressed, - }) { - final kind = item.kind; - - Color color = const Color.fromARGB(0xff, 0x61, 0x61, 0x61); - - if (kind == 'stderr' || - item.isError || - kind.caseInsensitiveEquals(FlutterEvent.error)) { - color = const Color.fromARGB(0xff, 0xF4, 0x43, 0x36); - } else if (kind == 'stdout') { - color = const Color.fromARGB(0xff, 0x78, 0x90, 0x9C); - } else if (kind.startsWith('flutter')) { - color = const Color.fromARGB(0xff, 0x00, 0x91, 0xea); - } else if (kind == 'gc') { - color = const Color.fromARGB(0xff, 0x42, 0x42, 0x42); - } - - // Use a font color that contrasts with the colored backgrounds. - final textStyle = Theme.of(context).regularTextStyleWithColor(Colors.white); - - return Container( - padding: const EdgeInsets.symmetric(horizontal: 3.0), - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(3.0), - ), - child: Text( - kind, - overflow: TextOverflow.ellipsis, - style: textStyle, - ), - ); - } -} diff --git a/packages/devtools_app/lib/src/screens/logging/_log_details.dart b/packages/devtools_app/lib/src/screens/logging/_log_details.dart index b803a8f851f..b9e0bef5f5f 100644 --- a/packages/devtools_app/lib/src/screens/logging/_log_details.dart +++ b/packages/devtools_app/lib/src/screens/logging/_log_details.dart @@ -80,6 +80,7 @@ class _LogDetailsState extends State child: Padding( padding: const EdgeInsets.all(denseSpacing), child: Scrollbar( + controller: scrollController, child: SingleChildScrollView( controller: scrollController, child: SelectableText( diff --git a/packages/devtools_app/lib/src/screens/logging/_logs_table.dart b/packages/devtools_app/lib/src/screens/logging/_logs_table.dart index 76a43e2fd4f..1e3fd454051 100644 --- a/packages/devtools_app/lib/src/screens/logging/_logs_table.dart +++ b/packages/devtools_app/lib/src/screens/logging/_logs_table.dart @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:devtools_app_shared/ui.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import '../../shared/primitives/utils.dart'; import '../../shared/table/table.dart'; -import '_kind_column.dart'; import '_message_column.dart'; import '_when_column.dart'; import 'logging_controller.dart'; @@ -15,37 +15,39 @@ import 'logging_controller.dart'; class LogsTable extends StatelessWidget { const LogsTable({ super.key, + required this.controller, required this.data, required this.selectionNotifier, required this.searchMatchesNotifier, required this.activeSearchMatchNotifier, }); + static final _logRowHeight = scaleByFontFactor(44.0); + + final LoggingController controller; final List data; final ValueNotifier selectionNotifier; final ValueListenable> searchMatchesNotifier; final ValueListenable activeSearchMatchNotifier; - static final when = WhenColumn(); - static final kind = KindColumn(); - static final message = MessageColumn(); - static final columns = [when, kind, message]; + static final whenColumn = WhenColumn(); + static final messageColumn = MessageColumn(); + static final columns = [whenColumn, messageColumn]; @override Widget build(BuildContext context) { - // TODO(kenz): use SearchableFlatTable instead. - return FlatTable( + return SearchableFlatTable( + searchController: controller, keyFactory: (LogData data) => ValueKey(data), data: data, dataKey: 'logs', autoScrollContent: true, - searchMatchesNotifier: searchMatchesNotifier, - activeSearchMatchNotifier: activeSearchMatchNotifier, columns: columns, selectionNotifier: selectionNotifier, - defaultSortColumn: when, + defaultSortColumn: whenColumn, defaultSortDirection: SortDirection.ascending, - secondarySortColumn: message, + secondarySortColumn: messageColumn, + rowHeight: _logRowHeight, ); } } diff --git a/packages/devtools_app/lib/src/screens/logging/_message_column.dart b/packages/devtools_app/lib/src/screens/logging/_message_column.dart index 1efc6478bb5..40677c5787e 100644 --- a/packages/devtools_app/lib/src/screens/logging/_message_column.dart +++ b/packages/devtools_app/lib/src/screens/logging/_message_column.dart @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:convert'; - -import 'package:devtools_app_shared/service.dart' show FlutterEvent; import 'package:devtools_app_shared/ui.dart'; import 'package:flutter/material.dart'; @@ -12,11 +9,11 @@ import '../../shared/primitives/utils.dart'; import '../../shared/table/table.dart'; import '../../shared/table/table_data.dart'; import 'logging_controller.dart'; +import 'metadata.dart'; -@visibleForTesting class MessageColumn extends ColumnData implements ColumnRenderer { - MessageColumn() : super.wide('Message'); + MessageColumn() : super.wide('Log'); @override bool get supportsSorting => false; @@ -59,67 +56,61 @@ class MessageColumn extends ColumnData // initial build. bool hasDetails() => !data.details.isNullOrEmpty; - if (data.kind.caseInsensitiveEquals(FlutterEvent.frame)) { - const color = Color.fromARGB(0xff, 0x00, 0x91, 0xea); - final text = Text( - getDisplayValue(data), - overflow: TextOverflow.ellipsis, - ); - - double frameLength = 0.0; - try { - final int micros = (jsonDecode(data.details!) as Map)['elapsed']; - frameLength = micros * 3.0 / 1000.0; - } catch (e) { - // ignore - } - - return Row( - children: [ - text, - Flexible( - child: Container( - height: 12.0, - width: frameLength, - decoration: const BoxDecoration(color: color), + return ValueListenableBuilder( + valueListenable: data.detailsComputed, + builder: (context, detailsComputed, _) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: borderPadding), + child: RichText( + text: TextSpan( + children: [ + if (hasSummary) + ...processAnsiTerminalCodes( + // TODO(helin24): Recompute summary length considering ansi codes. + // The current summary is generally the first 200 chars of details. + data.summary!, + theme.regularTextStyle, + ), + if (hasSummary && hasDetails()) + WidgetSpan( + child: Icon( + Icons.arrow_right, + size: defaultIconSize, + color: theme.colorScheme.onSurface, + ), + ), + if (hasDetails()) + ...processAnsiTerminalCodes( + detailsComputed ? data.details! : '', + theme.subtleTextStyle, + ), + ], + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), ), - ), - ], - ); - } else { - return ValueListenableBuilder( - valueListenable: data.detailsComputed, - builder: (context, detailsComputed, _) { - return RichText( - text: TextSpan( - children: [ - if (hasSummary) - ...processAnsiTerminalCodes( - // TODO(helin24): Recompute summary length considering ansi codes. - // The current summary is generally the first 200 chars of details. - data.summary!, - theme.regularTextStyle, - ), - if (hasSummary && hasDetails()) - WidgetSpan( - child: Icon( - Icons.arrow_right, - size: defaultIconSize, - color: theme.colorScheme.onSurface, - ), - ), - if (hasDetails()) - ...processAnsiTerminalCodes( - detailsComputed ? data.details! : '', - theme.subtleTextStyle, - ), - ], + Padding( + padding: const EdgeInsets.only( + top: borderPadding, + bottom: densePadding, + ), + child: LayoutBuilder( + builder: (context, constraints) { + return MetadataChips( + data: data, + maxWidth: constraints.maxWidth, + ); + }, + ), ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ); - }, - ); - } + ], + ); + }, + ); } } diff --git a/packages/devtools_app/lib/src/screens/logging/_when_column.dart b/packages/devtools_app/lib/src/screens/logging/_when_column.dart index 994b9453017..7cd1c2684c6 100644 --- a/packages/devtools_app/lib/src/screens/logging/_when_column.dart +++ b/packages/devtools_app/lib/src/screens/logging/_when_column.dart @@ -11,7 +11,7 @@ class WhenColumn extends ColumnData { WhenColumn() : super( 'When', - fixedWidthPx: scaleByFontFactor(100), + fixedWidthPx: scaleByFontFactor(80), ); @override diff --git a/packages/devtools_app/lib/src/screens/logging/logging_controller.dart b/packages/devtools_app/lib/src/screens/logging/logging_controller.dart index 27a98e6841f..8938f77b3c3 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_controller.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_controller.dart @@ -321,6 +321,8 @@ class LoggingController extends DisposableController jsonEncode(e.extensionData!.data), e.timestamp, summary: summary.toDiagnosticsNode().toString(), + level: Level.SEVERE.value, + isError: true, ), ); } else { @@ -445,6 +447,7 @@ class LoggingController extends DisposableController loggerName, details, e.timestamp, + level: level, isError: isError, summary: summary, detailsComputer: detailsComputer, @@ -626,12 +629,16 @@ class LoggingController extends DisposableController } extension type _LogRecord(Map json) { + int? get sequenceNumber => json['sequenceNumber']; + int? get level => json['level']; Map get loggerName => json['loggerName']; Map get message => json['message']; + Map get zone => json['zone']; + Map get error => json['error']; Map get stackTrace => json['stackTrace']; @@ -740,10 +747,11 @@ class LogData with SearchableDataMixin { this._details, this.timestamp, { this.summary, + int? level, this.isError = false, this.detailsComputer, this.node, - }) { + }) : level = level ?? (isError ? Level.SEVERE.value : Level.INFO.value) { final originalDetails = _details; // Fetch details immediately on creation. unawaited( @@ -762,6 +770,7 @@ class LogData with SearchableDataMixin { } final String kind; + final int? level; final int? timestamp; final bool isError; final String? summary; @@ -774,7 +783,7 @@ class LogData with SearchableDataMixin { String? get details => _details; - bool get needsComputing => !detailsComputed.value; + bool get needsComputing => !_detailsComputed.value; ValueListenable get detailsComputed => _detailsComputed; final _detailsComputed = ValueNotifier(false); diff --git a/packages/devtools_app/lib/src/screens/logging/logging_screen.dart b/packages/devtools_app/lib/src/screens/logging/logging_screen.dart index 065f3e708b8..c1bbf86fb9e 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_screen.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_screen.dart @@ -93,6 +93,7 @@ class _LoggingScreenState extends State RoundedOutlinedBorder( clip: true, child: LogsTable( + controller: controller, data: controller.filteredData.value, selectionNotifier: controller.selectedLog, searchMatchesNotifier: controller.searchMatches, diff --git a/packages/devtools_app/lib/src/screens/logging/logging_screen_v2/logging_table_row.dart b/packages/devtools_app/lib/src/screens/logging/logging_screen_v2/logging_table_row.dart index fc6aa17854f..63ff2a308ae 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_screen_v2/logging_table_row.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_screen_v2/logging_table_row.dart @@ -9,8 +9,10 @@ import 'package:devtools_app_shared/ui.dart'; import 'package:flutter/material.dart'; import '../../../shared/globals.dart'; +import '../../../shared/primitives/utils.dart'; import '../../../shared/ui/utils.dart'; import '../metadata.dart'; +import '../shared/constants.dart'; import 'log_data.dart'; class LoggingTableRow extends StatefulWidget { @@ -45,7 +47,11 @@ class LoggingTableRow extends StatefulWidget { String? elapsedFrameTimeAsString; try { final int micros = (jsonDecode(data.details!) as Map)['elapsed']; - elapsedFrameTimeAsString = (micros * 3.0 / 1000.0).toString(); + elapsedFrameTimeAsString = durationText( + Duration(microseconds: micros), + unit: DurationDisplayUnit.milliseconds, + fractionDigits: 2, + ); } catch (e) { // Ignore exception; [elapsedFrameTimeAsString] will be null. } @@ -167,3 +173,46 @@ class _LoggingTableRowState extends State { ); } } + +class WhenMetaDataChip extends MetadataChip { + WhenMetaDataChip({ + super.key, + required int? timestamp, + required super.maxWidth, + }) : super( + icon: null, + text: timestamp == null + ? '' + : loggingTableTimeFormat + .format(DateTime.fromMillisecondsSinceEpoch(timestamp)), + ); +} + +extension SizeExtension on MetadataChip { + /// Estimates the size of this single metadata chip. + /// + /// If the [build] method is changed then this may need to be updated + Size estimateSize() { + final horizontalPaddingCount = includeLeadingMargin ? 2 : 1; + final maxWidthInsidePadding = max( + 0.0, + maxWidth - MetadataChip.horizontalPadding * horizontalPaddingCount, + ); + final iconSize = Size.square(defaultIconSize); + final textSize = calculateTextSpanSize( + TextSpan( + text: text, + style: LoggingTableRow.metadataStyle, + ), + maxWidth: maxWidthInsidePadding, + ); + return Size( + ((icon != null || iconAsset != null) + ? iconSize.width + MetadataChip.iconPadding + : 0.0) + + textSize.width + + MetadataChip.horizontalPadding * horizontalPaddingCount, + max(iconSize.height, textSize.height) + MetadataChip.verticalPadding * 2, + ); + } +} diff --git a/packages/devtools_app/lib/src/screens/logging/metadata.dart b/packages/devtools_app/lib/src/screens/logging/metadata.dart index 08bbb4c7f62..2f517ae2b86 100644 --- a/packages/devtools_app/lib/src/screens/logging/metadata.dart +++ b/packages/devtools_app/lib/src/screens/logging/metadata.dart @@ -2,17 +2,85 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:math'; +import 'dart:convert'; +import 'package:devtools_app_shared/service.dart'; import 'package:devtools_app_shared/ui.dart'; import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import '../../shared/common_widgets.dart'; +import '../../shared/primitives/utils.dart'; import '../../shared/ui/icons.dart'; -import '../../shared/ui/utils.dart'; -import 'logging_screen_v2/logging_table_row.dart'; -import 'shared/constants.dart'; +import 'logging_controller.dart'; -// TODO(kenz): remove dependency on Logging V2 references. +class MetadataChips extends StatelessWidget { + const MetadataChips({ + super.key, + required this.data, + // TODO(kenz): remove maxWidth from these metadata chips once the Logging + // V2 code is removed. + required this.maxWidth, + }); + + final LogData data; + final double maxWidth; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + + // Prepare kind chip. + final kindIcon = KindMetaDataChip.generateIcon(data.kind); + final kindColors = KindMetaDataChip.generateColors(data.kind, colorScheme); + + // Prepare log level chip. + final logLevel = LogLevelMetadataChip.generateLogLevel(data.level!); + final logLevelColors = LogLevelMetadataChip.generateColors( + logLevel, + colorScheme, + ); + final logLevelChip = LogLevelMetadataChip( + level: logLevel, + rawLevel: data.level!, + maxWidth: maxWidth, + backgroundColor: logLevelColors.background, + foregroundColor: logLevelColors.foreground, + ); + + // Prepare frame time chip. + String? elapsedFrameTimeAsString; + try { + final int micros = (jsonDecode(data.details!) as Map)['elapsed']; + elapsedFrameTimeAsString = durationText( + Duration(microseconds: micros), + unit: DurationDisplayUnit.milliseconds, + fractionDigits: 2, + ); + } catch (e) { + // Ignore exception; [elapsedFrameTimeAsString] will be null. + } + + return Wrap( + children: [ + KindMetaDataChip( + kind: data.kind, + maxWidth: maxWidth, + icon: kindIcon.icon, + iconAsset: kindIcon.iconAsset, + backgroundColor: kindColors.background, + foregroundColor: kindColors.foreground, + ), + if (data.level != null) logLevelChip, + if (elapsedFrameTimeAsString != null) + FrameElapsedMetaDataChip( + maxWidth: maxWidth, + elapsedTimeDisplay: elapsedFrameTimeAsString, + ), + ], + ); + } +} abstract class MetadataChip extends StatelessWidget { const MetadataChip({ @@ -21,51 +89,45 @@ abstract class MetadataChip extends StatelessWidget { required this.text, this.icon, this.iconAsset, - this.includeLeadingPadding = true, + this.backgroundColor, + this.foregroundColor, + this.includeLeadingMargin = true, }); final double maxWidth; final IconData? icon; final String? iconAsset; final String text; - final bool includeLeadingPadding; + final Color? backgroundColor; + final Color? foregroundColor; + final bool includeLeadingMargin; - static const horizontalPadding = denseSpacing; - static const verticalPadding = densePadding; + static const horizontalPadding = densePadding; + static const verticalPadding = borderPadding; static const iconPadding = densePadding; + static final height = scaleByFontFactor(18.0); + static const _borderRadius = 4.0; - /// Estimates the size of this single metadata chip. - /// - /// If the [build] method is changed then this may need to be updated - Size estimateSize() { - final horizontalPaddingCount = includeLeadingPadding ? 2 : 1; - final maxWidthInsidePadding = - max(0.0, maxWidth - horizontalPadding * horizontalPaddingCount); - final iconSize = Size.square(defaultIconSize); - final textSize = calculateTextSpanSize( - _buildValueText(), - maxWidth: maxWidthInsidePadding, - ); - return Size( - ((icon != null || iconAsset != null) - ? iconSize.width + iconPadding - : 0.0) + - textSize.width + - horizontalPadding * horizontalPaddingCount, - max(iconSize.height, textSize.height) + verticalPadding * 2, - ); - } - - /// If this build method is changed then you may need to modify [estimateSize()] @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final backgroundColor = + this.backgroundColor ?? theme.colorScheme.secondaryContainer; + final foregroundColor = + this.foregroundColor ?? theme.colorScheme.onSecondaryContainer; + return Container( constraints: BoxConstraints(maxWidth: maxWidth), - padding: EdgeInsets.fromLTRB( - includeLeadingPadding ? horizontalPadding : 0, - verticalPadding, - horizontalPadding, - verticalPadding, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(_borderRadius), + ), + margin: includeLeadingMargin + ? const EdgeInsets.only(left: denseSpacing) + : null, + padding: const EdgeInsets.symmetric( + horizontal: horizontalPadding, + vertical: verticalPadding, ), child: Row( mainAxisSize: MainAxisSize.min, @@ -75,7 +137,7 @@ abstract class MetadataChip extends StatelessWidget { icon: icon, iconAsset: iconAsset, size: defaultIconSize, - color: Theme.of(context).colorScheme.subtleTextColor, + color: foregroundColor, ), const SizedBox(width: iconPadding), ] else @@ -83,35 +145,15 @@ abstract class MetadataChip extends StatelessWidget { // chips, regardless of whether the chip includes an icon. SizedBox(height: defaultIconSize), RichText( - text: _buildValueText(), + text: TextSpan( + text: text, + style: theme.regularTextStyleWithColor(foregroundColor), + ), ), ], ), ); } - - TextSpan _buildValueText() { - return TextSpan( - text: text, - style: LoggingTableRow.metadataStyle, - ); - } -} - -@visibleForTesting -class WhenMetaDataChip extends MetadataChip { - WhenMetaDataChip({ - super.key, - required int? timestamp, - required super.maxWidth, - }) : super( - icon: null, - text: timestamp == null - ? '' - : loggingTableTimeFormat - .format(DateTime.fromMillisecondsSinceEpoch(timestamp)), - includeLeadingPadding: false, - ); } class KindMetaDataChip extends MetadataChip { @@ -121,7 +163,9 @@ class KindMetaDataChip extends MetadataChip { required super.maxWidth, super.icon, super.iconAsset, - }) : super(text: kind); + super.backgroundColor, + super.foregroundColor, + }) : super(text: kind, includeLeadingMargin: false); static ({IconData? icon, String? iconAsset}) generateIcon(String kind) { IconData? kindIcon = Icons.list_rounded; @@ -134,9 +178,29 @@ class KindMetaDataChip extends MetadataChip { } return (icon: kindIcon, iconAsset: kindIconAsset); } + + static ({Color background, Color foreground}) generateColors( + String kind, + ColorScheme colorScheme, + ) { + Color background, foreground; + if (kind == 'stderr' || kind.caseInsensitiveEquals(FlutterEvent.error)) { + background = colorScheme.errorContainer; + foreground = colorScheme.onErrorContainer; + } else if (kind == 'stdout') { + background = colorScheme.surfaceContainerHighest; + foreground = colorScheme.onSurfaceVariant; + } else if (kind.startsWith('flutter')) { + background = colorScheme.primaryContainer; + foreground = colorScheme.onPrimaryContainer; + } else { + background = colorScheme.secondaryContainer; + foreground = colorScheme.onSecondaryContainer; + } + return (background: background, foreground: foreground); + } } -@visibleForTesting class FrameElapsedMetaDataChip extends MetadataChip { const FrameElapsedMetaDataChip({ super.key, @@ -144,3 +208,49 @@ class FrameElapsedMetaDataChip extends MetadataChip { required String elapsedTimeDisplay, }) : super(icon: Icons.timer, text: elapsedTimeDisplay); } + +class LogLevelMetadataChip extends MetadataChip { + LogLevelMetadataChip({ + super.key, + required Level level, + required int rawLevel, + required super.maxWidth, + super.backgroundColor, + super.foregroundColor, + }) : super(text: 'Level.${level.name} ($rawLevel)'); + + static Level generateLogLevel(int rawLevel) { + var level = Level.FINEST; + for (final l in Level.LEVELS) { + if (rawLevel >= l.value) { + level = l; + } + } + return level; + } + + static ({Color background, Color foreground}) generateColors( + Level level, + ColorScheme colorScheme, + ) { + Color background, foreground; + if (level >= Level.SHOUT) { + background = colorScheme.errorContainer.darken(0.2); + foreground = colorScheme.onErrorContainer; + } else if (level >= Level.SEVERE) { + background = colorScheme.errorContainer; + foreground = colorScheme.onErrorContainer; + } else if (level >= Level.WARNING) { + background = colorScheme.warningContainer; + foreground = colorScheme.onWarningContainer; + } else if (level >= Level.INFO) { + background = colorScheme.secondaryContainer; + foreground = colorScheme.onSecondaryContainer; + } else { + // This includes Level.CONFIG, Level.FINE, Level.FINER, Level.FINEST. + background = colorScheme.surfaceContainerHighest; + foreground = colorScheme.onSurfaceVariant; + } + return (background: background, foreground: foreground); + } +} diff --git a/packages/devtools_app/lib/src/shared/table/_flat_table.dart b/packages/devtools_app/lib/src/shared/table/_flat_table.dart index 38c06f9832a..24299c7394f 100644 --- a/packages/devtools_app/lib/src/shared/table/_flat_table.dart +++ b/packages/devtools_app/lib/src/shared/table/_flat_table.dart @@ -30,6 +30,7 @@ class SearchableFlatTable extends FlatTable { super.preserveVerticalScrollPosition = false, super.includeColumnGroupHeaders = true, super.sizeColumnsToFit = true, + super.rowHeight, super.selectionNotifier, }) : super( searchMatchesNotifier: searchController.searchMatches, @@ -69,6 +70,7 @@ class FlatTable extends StatefulWidget { this.includeColumnGroupHeaders = true, this.tallHeaders = false, this.sizeColumnsToFit = true, + this.rowHeight, this.headerColor, this.fillWithEmptyRows = false, this.enableHoverHandling = false, @@ -93,6 +95,8 @@ class FlatTable extends StatefulWidget { /// table fits in view (e.g. so that there is no horizontal scrolling). final bool sizeColumnsToFit; + final double? rowHeight; + // TODO(kenz): should we enable this behavior by default? Does it ever matter // to preserve the order of the original data passed to a flat table? /// Whether table sorting should sort the original data list instead of @@ -285,7 +289,7 @@ class FlatTableState extends State> with AutoDisposeMixin { autoScrollContent: widget.autoScrollContent, rowBuilder: _buildRow, activeSearchMatchNotifier: widget.activeSearchMatchNotifier, - rowItemExtent: defaultRowHeight, + rowItemExtent: widget.rowHeight ?? defaultRowHeight, preserveVerticalScrollPosition: widget.preserveVerticalScrollPosition, tallHeaders: widget.tallHeaders, headerColor: widget.headerColor, diff --git a/packages/devtools_app/lib/src/shared/table/table.dart b/packages/devtools_app/lib/src/shared/table/table.dart index d9fe6cf355e..902d7778903 100644 --- a/packages/devtools_app/lib/src/shared/table/table.dart +++ b/packages/devtools_app/lib/src/shared/table/table.dart @@ -422,6 +422,7 @@ class DevToolsTableState extends State> tall: widget.tallHeaders, backgroundColor: widget.headerColor, ), + // TODO(kenz): add support for excluding column headers. TableRow.tableColumnHeader( key: const Key('Table header'), linkedScrollControllerGroup: diff --git a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md index 6c51a584b74..34cc87a68f9 100644 --- a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md +++ b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md @@ -10,6 +10,8 @@ To learn more about DevTools, check out the ## General updates +TODO: Remove this section if there are not any general updates. + ## Inspector updates TODO: Remove this section if there are not any general updates. @@ -39,6 +41,10 @@ TODO: Remove this section if there are not any general updates. * Fetch log details immediately upon receiving logs so that log data is not lost due to lazy loading. - [#8421](https://github.com/flutter/devtools/pull/8421) +* Added support for displaying metadata, such as log +severity. [#8419](https://github.com/flutter/devtools/pull/8419) + ![Logging metadata display](images/log_metadata.png "Logging metadata display") + * Fix a bug where logs would get out of order after midnight. - [#8420](https://github.com/flutter/devtools/pull/8420) diff --git a/packages/devtools_app/release_notes/images/log_metadata.png b/packages/devtools_app/release_notes/images/log_metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..7389074fde22e991ddc596f46e0fcc8f9bb1eb89 GIT binary patch literal 108047 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 EFM&8#u>b%7 literal 0 HcmV?d00001 diff --git a/packages/devtools_app/test/logging/logging_screen_v2/logging_table_row_test.dart b/packages/devtools_app/test/logging/logging_screen_v2/logging_table_row_test.dart index d7dad146f0c..792f3b1ddb1 100644 --- a/packages/devtools_app/test/logging/logging_screen_v2/logging_table_row_test.dart +++ b/packages/devtools_app/test/logging/logging_screen_v2/logging_table_row_test.dart @@ -21,6 +21,9 @@ void main() { setGlobal(ServiceConnectionManager, FakeServiceConnectionManager()); }); + return; + + // ignore: dead_code, intentionally skipped tests. This code will be removed soon. group('logging_table_row', () { for (double windowWidth = 208.0; windowWidth < 600.0; windowWidth += 15.0) { const numberOfChips = 3; diff --git a/packages/devtools_app/test/logging/metadata_test.dart b/packages/devtools_app/test/logging/metadata_test.dart new file mode 100644 index 00000000000..45d31e95d88 --- /dev/null +++ b/packages/devtools_app/test/logging/metadata_test.dart @@ -0,0 +1,90 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:devtools_app/devtools_app.dart'; +import 'package:devtools_app/src/screens/logging/metadata.dart'; +import 'package:devtools_app_shared/ui.dart'; +import 'package:devtools_app_shared/utils.dart'; +import 'package:devtools_test/helpers.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:logging/logging.dart'; + +import '../test_infra/matchers/matchers.dart'; + +void main() { + const windowSize = Size(1000.0, 1000.0); + + final testLogs = [ + // Log with kind stdout + LogData('stdout', 'test details', 0), + // Log with kind stderr + LogData('stderr', 'test details', 1, isError: true), + // Log with kind 'flutter.*' + LogData('flutter.foo', 'test details', 2), + // Log with Flutter frame time. + LogData('flutter.frame', '{"elapsed":16249}', 3), + // Log with Flutter error. + LogData('flutter.error', 'some error', 4), + // Log with level FINEST + LogData('my_app', 'test details', 5, level: Level.FINEST.value), + // Log with level FINER + LogData('my_app', 'test details', 6, level: Level.FINER.value), + // Log with level FINE + LogData('my_app', 'test details', 7, level: Level.FINE.value), + // Log with level CONFIG + LogData('my_app', 'test details', 8, level: Level.CONFIG.value), + // Log with level INFO + LogData('my_app', 'test details', 9, level: Level.INFO.value), + // Log with level WARNING + LogData('my_app', 'test details', 10, level: Level.WARNING.value), + // Log with level SEVERE + LogData('my_app', 'test details', 11, level: Level.SEVERE.value), + // Log with level SHOUT + LogData('my_app', 'test details', 12, level: Level.SHOUT.value), + ]; + + setUp(() { + setGlobal(IdeTheme, getIdeTheme()); + }); + + group('MetadataChips', () { + const testKey = Key('test container'); + + Future pumpMetadataChips(WidgetTester tester) async { + await tester.pumpWidget( + wrapSimple( + Column( + key: testKey, + children: testLogs.map((log) { + return Flexible( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: MetadataChips( + data: log, + maxWidth: 1000.0, + ), + ), + ); + }).toList(), + ), + ), + ); + } + + testWidgetsWithWindowSize( + 'render for list of logs', + windowSize, + (WidgetTester tester) async { + await pumpMetadataChips(tester); + await expectLater( + find.byKey(testKey), + matchesDevToolsGolden( + '../../test_infra/goldens/logging/metadata_chips.png', + ), + ); + }, + ); + }); +} diff --git a/packages/devtools_app/test_infra/goldens/logging/metadata_chips.png b/packages/devtools_app/test_infra/goldens/logging/metadata_chips.png new file mode 100644 index 0000000000000000000000000000000000000000..0af1ca737327eb01044a0f13cdf5d4a4f7bb5523 GIT binary patch literal 13018 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 f@GSy=BLaeYA7X0hI#ZSWj&j(*R6qNG = T Function(Map json); /// Mixin to declare a class as serializable. /// -/// Classes that implement this mixin should also implement [toJson] method. +/// Classes that implement this mixin should also implement [fromJson] factory +/// constructor. /// See https://docs.flutter.dev/data-and-backend/serialization/json#serializing-json-inside-model-classes. mixin Serializable { Map toJson();