feat(telemetry): add telemetry client and services for tracking events
- Implemented TelemetryClient to handle event queuing and flushing to the telemetry endpoint. - Created TtfsTelemetryService for emitting specific telemetry events related to TTFS. - Added tests for TelemetryClient to ensure event queuing and flushing functionality. - Introduced models for reachability drift detection, including DriftResult and DriftedSink. - Developed DriftApiService for interacting with the drift detection API. - Updated FirstSignalCardComponent to emit telemetry events on signal appearance. - Enhanced localization support for first signal component with i18n strings.
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
// -----------------------------------------------------------------------------
|
||||
// IInternalCallGraphBuilder.cs
|
||||
// Sprint: SPRINT_3700_0003_0001_trigger_extraction
|
||||
// Description: Interface for building internal call graphs from package sources.
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StellaOps.Scanner.VulnSurfaces.CallGraph;
|
||||
|
||||
/// <summary>
|
||||
/// Builds internal call graphs from package/assembly sources.
|
||||
/// Implementations exist for different ecosystems (.NET, Java, Node.js, Python).
|
||||
/// </summary>
|
||||
public interface IInternalCallGraphBuilder
|
||||
{
|
||||
/// <summary>
|
||||
/// Ecosystem this builder supports (e.g., "nuget", "maven", "npm", "pypi").
|
||||
/// </summary>
|
||||
string Ecosystem { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Checks if this builder can handle the given package.
|
||||
/// </summary>
|
||||
/// <param name="packagePath">Path to package archive or extracted directory.</param>
|
||||
bool CanHandle(string packagePath);
|
||||
|
||||
/// <summary>
|
||||
/// Builds an internal call graph from a package.
|
||||
/// </summary>
|
||||
/// <param name="request">Build request with package details.</param>
|
||||
/// <param name="cancellationToken">Cancellation token.</param>
|
||||
/// <returns>Internal call graph for the package.</returns>
|
||||
Task<InternalCallGraphBuildResult> BuildAsync(
|
||||
InternalCallGraphBuildRequest request,
|
||||
CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request to build an internal call graph.
|
||||
/// </summary>
|
||||
public sealed record InternalCallGraphBuildRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// Package identifier (PURL or package name).
|
||||
/// </summary>
|
||||
public required string PackageId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Package version.
|
||||
/// </summary>
|
||||
public required string Version { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Path to the package archive or extracted directory.
|
||||
/// </summary>
|
||||
public required string PackagePath { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Whether to include private methods in the graph.
|
||||
/// Default is false (only public API surface).
|
||||
/// </summary>
|
||||
public bool IncludePrivateMethods { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Maximum depth for call graph traversal.
|
||||
/// </summary>
|
||||
public int MaxDepth { get; init; } = 20;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Result of building an internal call graph.
|
||||
/// </summary>
|
||||
public sealed record InternalCallGraphBuildResult
|
||||
{
|
||||
/// <summary>
|
||||
/// Whether the build succeeded.
|
||||
/// </summary>
|
||||
public bool Success { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// The built call graph (null if failed).
|
||||
/// </summary>
|
||||
public InternalCallGraph? Graph { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Error message if build failed.
|
||||
/// </summary>
|
||||
public string? Error { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Build duration.
|
||||
/// </summary>
|
||||
public TimeSpan Duration { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Number of assemblies/files processed.
|
||||
/// </summary>
|
||||
public int FilesProcessed { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Creates a successful result.
|
||||
/// </summary>
|
||||
public static InternalCallGraphBuildResult Ok(InternalCallGraph graph, TimeSpan duration, int filesProcessed) =>
|
||||
new()
|
||||
{
|
||||
Success = true,
|
||||
Graph = graph,
|
||||
Duration = duration,
|
||||
FilesProcessed = filesProcessed
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Creates a failed result.
|
||||
/// </summary>
|
||||
public static InternalCallGraphBuildResult Fail(string error, TimeSpan duration) =>
|
||||
new()
|
||||
{
|
||||
Success = false,
|
||||
Error = error,
|
||||
Duration = duration
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user