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
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => (
/>
<SidebarItem icon={ExtensionIcon} to="api-docs" text="APIs" />
<SidebarItem icon={LibraryBooks} to="docs" text="Docs" />
<SidebarItem icon={AssessmentIcon} to="parseable-logstream" text="Parseable Logstream" />
<SidebarItem icon={AssessmentIcon} to="parseable-logstream" text="Parseable Dataset" />
<SidebarItem icon={CreateComponentIcon} to="create" text="Create..." />
{/* End global nav */}
<SidebarDivider />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Changelog

All notable changes to this project will be documented in this file.

## [0.2.0] - 2025-07-14

### Changed
- Updated UI to use "Parseable Dataset" terminology for better clarity
- Fixed Material Table rendering issue with "Cannot use 'in' operator" error
- Updated documentation and references throughout the codebase
- Removed time range controls from the UI for simplicity
- Added proper handling of log data for table rendering

### Fixed
- Fixed module import/export paths (removed .ts/.tsx extensions)
- Fixed component name consistency across the plugin
- Resolved runtime errors in the table component

## [0.1.0] - Initial Release

### Added
- Initial implementation of the Parseable plugin for Backstage
- Support for viewing log streams from Parseable
- Dataset selection functionality
- Search capabilities
- Live tail support
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Parseable Logstream Plugin for Backstage
# Parseable Dataset Plugin for Backstage

This plugin allows engineers to pull their own Parseable log-streams directly onto an entity page in Backstage.
This plugin allows engineers to pull their own Parseable datasets directly onto an entity page in Backstage.

## Features

- View log streams from Parseable directly in Backstage
- View datasets from Parseable directly in Backstage
- Select from available datasets the user has access to
- Live tail support with pause/resume functionality
- Copy log entries to clipboard
Expand Down Expand Up @@ -75,7 +75,7 @@ const serviceEntityPage = (

### Entity Annotation

To enable the Parseable logstream for an entity, add the following annotation to your `catalog-info.yaml`:
To enable the Parseable dataset for an entity, add the following annotation to your `catalog-info.yaml`:

```yaml
apiVersion: backstage.io/v1alpha1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@parseable/backstage-plugin-logstream",
"version": "0.1.0",
"version": "0.2.0",
"description": "Backstage plugin for integrating with Parseable log streams",
"keywords": ["backstage", "plugin", "parseable", "logs", "monitoring"],
"author": "Parseable",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,12 @@ export const ParseableLogstreamPage = () => {
// Safely prepare log data for rendering to avoid 'in' operator errors
const prepareLogsForRendering = (logs: LogEntry[]): Record<string, any>[] => {
return logs.map(log => {
const preparedLog: Record<string, any> = {};
// Create a new object with safe values for the table
const preparedLog: Record<string, any> = {
// Add a special property that Material Table needs for the 'in' operator
original: {}
};

Object.entries(log).forEach(([key, value]) => {
// Ensure all values are strings or primitives, not complex objects
if (value === null || value === undefined) {
Expand All @@ -396,15 +401,21 @@ export const ParseableLogstreamPage = () => {
} else {
preparedLog[key] = String(value);
}

// Also store the original value in the 'original' property
preparedLog.original[key] = value;
});

// Add levelColor separately since it's used for styling
if (log.levelColor) {
preparedLog.levelColor = log.levelColor;
preparedLog.original.levelColor = log.levelColor;
}

return preparedLog;
});
};

// Format body column content for better readability
const formatBodyContent = (value: any): string => {
if (!value) return '';
Expand Down Expand Up @@ -449,7 +460,7 @@ export const ParseableLogstreamPage = () => {
if (error) {
return (
<Content>
<ContentHeader title="Parseable Logstream" />
<ContentHeader title="Parseable Dataset" />
<ErrorPanel
error={error}
>
Expand All @@ -462,7 +473,7 @@ export const ParseableLogstreamPage = () => {
if (datasets.length === 0) {
return (
<Content>
<ContentHeader title="Parseable Logstream" />
<ContentHeader title="Parseable Dataset" />
<EmptyState
missing="data"
title="No datasets available"
Expand All @@ -474,15 +485,15 @@ export const ParseableLogstreamPage = () => {

return (
<Content>
<ContentHeader title="Parseable Logstream">
<ContentHeader title="Parseable Dataset">
<SupportButton>
View your Parseable log streams with advanced search capabilities.
View your Parseable datasets with advanced search capabilities.
</SupportButton>
</ContentHeader>

<Grid container spacing={3}>
<Grid item xs={12}>
<InfoCard title="Parseable Logs">
<InfoCard title="Parseable Dataset">
{!entityContext.available && (
<div style={{ marginBottom: '24px' }}>
<Typography variant="subtitle1" gutterBottom>
Expand Down Expand Up @@ -523,7 +534,7 @@ export const ParseableLogstreamPage = () => {
</Select>
</FormControl>

<div className={classes.timeRangeControls}>
{/* <div className={classes.timeRangeControls}>
<TextField
label="Start Date"
type="datetime-local"
Expand All @@ -543,7 +554,7 @@ export const ParseableLogstreamPage = () => {
disabled={isLiveTail}
size="small"
/>
</div>
</div> */}

<TextField
className={classes.searchFieldEnhanced}
Expand Down