From 1be4731710ae0003b492eeb697912cddf42c56ee Mon Sep 17 00:00:00 2001 From: CheetoDa <31571545+Calm-Rock@users.noreply.github.com> Date: Wed, 20 Dec 2023 20:16:21 +0530 Subject: [PATCH] feat: added frontend for newly addded flows (#4151) * feat: added frontend for newly addded flows * chore: added content for flows * chore: updated content for dotnet docs * chore: updated go instrumentation and http logs content * fix: removed console log and return true * fix: quickstart by default and cloudwatch logs * fix: removed console log --- frontend/public/Logos/cloudwatch.png | Bin 0 -> 52632 bytes frontend/public/Logos/dotnet.png | Bin 0 -> 3778 bytes frontend/public/Logos/heroku.png | Bin 0 -> 957 bytes frontend/public/Logos/http.png | Bin 0 -> 4446 bytes frontend/public/Logos/vercel.png | Bin 0 -> 46474 bytes .../dotnet-kubernetes-installOtelCollector.md | 24 +++++ ...dotnet-kubernetes-instrumentApplication.md | 65 ++++++++++++ .../dotnet-kubernetes-runApplication.md | 10 ++ ...xamd64-quickStart-instrumentApplication.md | 71 +++++++++++++ ...et-linuxamd64-quickStart-runApplication.md | 10 ++ ...xamd64-recommended-installOtelCollector.md | 98 +++++++++++++++++ ...amd64-recommended-instrumentApplication.md | 67 ++++++++++++ ...t-linuxamd64-recommended-runApplication.md | 18 ++++ ...xarm64-quickStart-instrumentApplication.md | 70 +++++++++++++ ...et-linuxarm64-quickStart-runApplication.md | 10 ++ ...xarm64-recommended-installOtelCollector.md | 99 ++++++++++++++++++ ...arm64-recommended-instrumentApplication.md | 68 ++++++++++++ ...t-linuxarm64-recommended-runApplication.md | 18 ++++ ...samd64-quickStart-instrumentApplication.md | 70 +++++++++++++ ...et-macosamd64-quickStart-runApplication.md | 10 ++ ...samd64-recommended-installOtelCollector.md | 97 +++++++++++++++++ ...amd64-recommended-instrumentApplication.md | 67 ++++++++++++ ...t-macosamd64-recommended-runApplication.md | 18 ++++ ...sarm64-quickStart-instrumentApplication.md | 70 +++++++++++++ ...et-macosarm64-quickStart-runApplication.md | 10 ++ ...sarm64-recommended-installOtelCollector.md | 98 +++++++++++++++++ ...arm64-recommended-instrumentApplication.md | 68 ++++++++++++ ...t-macosarm64-recommended-runApplication.md | 18 ++++ ...golang-kubernetes-instrumentApplication.md | 3 +- ...xamd64-quickStart-instrumentApplication.md | 1 + ...amd64-recommended-instrumentApplication.md | 1 + ...xarm64-quickStart-instrumentApplication.md | 1 + ...arm64-recommended-instrumentApplication.md | 1 + ...samd64-quickStart-instrumentApplication.md | 1 + ...amd64-recommended-instrumentApplication.md | 1 + ...sarm64-quickStart-instrumentApplication.md | 1 + ...arm64-recommended-instrumentApplication.md | 1 + .../cloudwatch-linuxamd64-configureAws.md | 39 +++++++ ...cloudwatch-linuxamd64-configureReceiver.md | 50 +++++++++ ...udwatch-linuxamd64-installOtelCollector.md | 94 +++++++++++++++++ .../cloudwatch-linuxamd64-sendLogs.md | 38 +++++++ .../cloudwatch-linuxarm64-configureAws.md | 39 +++++++ ...cloudwatch-linuxarm64-configureReceiver.md | 50 +++++++++ ...udwatch-linuxarm64-installOtelCollector.md | 95 +++++++++++++++++ .../cloudwatch-linuxarm64-sendLogs.md | 38 +++++++ .../cloudwatch-macosamd64-configureAws.md | 39 +++++++ ...cloudwatch-macosamd64-configureReceiver.md | 50 +++++++++ ...udwatch-macosamd64-installOtelCollector.md | 94 +++++++++++++++++ .../cloudwatch-macosamd64-sendLogs.md | 38 +++++++ .../cloudwatch-macosarm64-configureAws.md | 39 +++++++ ...cloudwatch-macosarm64-configureReceiver.md | 50 +++++++++ ...udwatch-macosarm64-installOtelCollector.md | 93 ++++++++++++++++ .../cloudwatch-macosarm64-sendLogs.md | 38 +++++++ .../Heroku/md-docs/heroku-addHttpDrain.md | 29 +++++ .../Http/md-docs/httpJsonPayload.md | 95 +++++++++++++++++ .../Vercel/md-docs/vercel-setupLogDrains.md | 50 +++++++++ .../Steps/MarkdownStep/MarkdownStep.tsx | 1 - .../Steps/SelectMethod/SelectMethod.tsx | 10 +- .../constants/apmDocFilePaths.ts | 83 ++++++++++++++- .../constants/logsManagementDocFilePaths.ts | 65 ++++++++++++ .../constants/stepsConfig.tsx | 34 ++++++ .../context/OnboardingContext.tsx | 2 +- .../utils/dataSourceUtils.ts | 31 +++++- .../OnboardingContainer/utils/getSteps.ts | 20 ++++ 64 files changed, 2458 insertions(+), 11 deletions(-) create mode 100644 frontend/public/Logos/cloudwatch.png create mode 100644 frontend/public/Logos/dotnet.png create mode 100644 frontend/public/Logos/heroku.png create mode 100644 frontend/public/Logos/http.png create mode 100644 frontend/public/Logos/vercel.png create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureAws.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureReceiver.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-sendLogs.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureAws.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureReceiver.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-sendLogs.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureAws.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureReceiver.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-sendLogs.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureAws.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureReceiver.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-sendLogs.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Heroku/md-docs/heroku-addHttpDrain.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Http/md-docs/httpJsonPayload.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/LogsManagement/Vercel/md-docs/vercel-setupLogDrains.md diff --git a/frontend/public/Logos/cloudwatch.png b/frontend/public/Logos/cloudwatch.png new file mode 100644 index 0000000000000000000000000000000000000000..57cd671f42cbfcfebb76d5fefd96e27e963c0b36 GIT binary patch literal 52632 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

yuFtSnpO6i|ME}3*n4r8Gn-2;^rr7;RCq&& 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 literal 0 HcmV?d00001 diff --git a/frontend/public/Logos/heroku.png b/frontend/public/Logos/heroku.png new file mode 100644 index 0000000000000000000000000000000000000000..0328d37b3a1fa9548ce0262442180b2b772f515c GIT binary patch literal 957 zcmV;u148_XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D15!yuK~#8N?VF*q z(?Af$&moaWB!2=5I<(AGB9X{SB=WgR6w|b(&mk+3NaT~1$R{gnVK?~-nckPuZT8Bg z$v5+xHjl<$Si8qt20W!irAPtqa zvwl`GHK5p!!s-RmM3Uk^@_u%*G(ZbPib&Pe=eKW>odLSILH9^H@Ohp32XZrDr`vMq z9tm4@tl!0CcLrRW!2ov90&1m__Q8PT_}mx_U1287!y(4r=`kekvSbUP}`A+i857XZP-S7L?z=^)}d!5Tw z48Z=~RKIXl9M2U~4t9;(Vro#_$3`*(^c0n1XYFrci!D+{g0ZB}`M4W^&C1PjTpN&@ zip5)SF+jJes_VJ^pu{LEZ4isM&^m$el^k;gwNkNo3myg}2eneMcngC8>|k!7Rw@>6 z!NY(gx2bhdD;0~k&^kf27)kr06>6no@fO-A5Mf>JI``KpD{T;qx8P#HK^|*!2GUcp zcnhuusPNW?>$rf_R4m?ty8$ZiaRF(mSiFTK2Bs4n%nkDW3Mt@{| fg!ku{4F~2mYQW| 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 literal 0 HcmV?d00001 diff --git a/frontend/public/Logos/vercel.png b/frontend/public/Logos/vercel.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac66ce6adde1dedcc7ee9dd863e3f56f72a78e2 GIT binary patch literal 46474 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 literal 0 HcmV?d00001 diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-installOtelCollector.md new file mode 100644 index 0000000000..946b7fbdbf --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-installOtelCollector.md @@ -0,0 +1,24 @@ +## Install otel-collector in your Kubernetes infra +  + +Add the SigNoz Helm Chart repository +```bash +helm repo add signoz https://charts.signoz.io +``` +  + +If the chart is already present, update the chart to the latest using: +```bash +helm repo update +``` +  + +Install the Kubernetes Infrastructure chart provided by SigNoz +```bash +helm install my-release signoz/k8s-infra \ +--set otelCollectorEndpoint=ingest.{{REGION}}.signoz.cloud:443 \ +--set otelInsecure=false \ +--set signozApiKey={{SIGNOZ_INGESTION_KEY}} \ +--set global.clusterName= +``` +- Replace `` with the name of the Kubernetes cluster or a unique identifier of the cluster. diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-instrumentApplication.md new file mode 100644 index 0000000000..44b504f094 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-instrumentApplication.md @@ -0,0 +1,65 @@ +After setting up the Otel collector agent, follow the steps below to instrument your .NET Application +  +  + +### Step 1: Install OpenTelemetry Dependencies +Install the following dependencies in your application. + +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri("http://localhost:4317"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-runApplication.md new file mode 100644 index 0000000000..88c4e0be99 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-runApplication.md @@ -0,0 +1,10 @@ +  + +To run your .NET application, use the below command : + +```bash +dotnet build +dotnet run +``` + +Once you run your .NET application, interact with your application to generate some load and see your application in the SigNoz UI. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-instrumentApplication.md new file mode 100644 index 0000000000..b5b1910fbe --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-instrumentApplication.md @@ -0,0 +1,71 @@ + +### Step 1: Install OpenTelemetry Dependencies +Dependencies related to OpenTelemetry exporter and SDK have to be installed first. + +Run the below commands after navigating to the application source folder: +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + //sigNoz Cloud Endpoint + otlpOptions.Endpoint = new Uri("https://ingest.{{REGION}}.signoz.cloud:443"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + + //SigNoz Cloud account Ingestion key + string headerKey = "signoz-access-token"; + string headerValue = "{{SIGNOZ_INGESTION_KEY}}"; + + string formattedHeader = $"{headerKey}={headerValue}"; + otlpOptions.Headers = formattedHeader; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` + +  + + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-runApplication.md new file mode 100644 index 0000000000..556561d63c --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-runApplication.md @@ -0,0 +1,10 @@ +  +To run your .NET application, use the below command : + +```bash +dotnet build +dotnet run +``` + +Once you run your .NET application, interact with your application to generate some load and see your application in the SigNoz UI. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md new file mode 100644 index 0000000000..09602cc003 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md @@ -0,0 +1,98 @@ +## Setup OpenTelemetry Binary as an agent +  + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +``` + +  + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +``` + +  + +### Step 3: Create `config.yaml` in `otelcol-contrib` folder with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-instrumentApplication.md new file mode 100644 index 0000000000..5f406890d6 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-instrumentApplication.md @@ -0,0 +1,67 @@ +After setting up the Otel collector agent, follow the steps below to instrument your .NET Application + +  +  + +### Step 1: Install OpenTelemetry Dependencies +Install the following dependencies in your application. + +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri("http://localhost:4317"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` +  + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-runApplication.md new file mode 100644 index 0000000000..6a591b202e --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-runApplication.md @@ -0,0 +1,18 @@ +  +Once you are done intrumenting your .NET application, you can run it using the below commands +  + +### Step 1: Run OTel Collector + Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step + +```bash +./otelcol-contrib --config ./config.yaml +``` + +  + +### Step 2: Run your .NET application +```bash +dotnet build +dotnet run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-instrumentApplication.md new file mode 100644 index 0000000000..1783dd2f41 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-instrumentApplication.md @@ -0,0 +1,70 @@ + +### Step 1: Install OpenTelemetry Dependencies +Dependencies related to OpenTelemetry exporter and SDK have to be installed first. + +Run the below commands after navigating to the application source folder: +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + //sigNoz Cloud Endpoint + otlpOptions.Endpoint = new Uri("https://ingest.{{REGION}}.signoz.cloud:443"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + + //SigNoz Cloud account Ingestion key + string headerKey = "signoz-access-token"; + string headerValue = "{{SIGNOZ_INGESTION_KEY}}"; + + string formattedHeader = $"{headerKey}={headerValue}"; + otlpOptions.Headers = formattedHeader; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` + +  + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-runApplication.md new file mode 100644 index 0000000000..556561d63c --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-runApplication.md @@ -0,0 +1,10 @@ +  +To run your .NET application, use the below command : + +```bash +dotnet build +dotnet run +``` + +Once you run your .NET application, interact with your application to generate some load and see your application in the SigNoz UI. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md new file mode 100644 index 0000000000..a56cc30fcc --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md @@ -0,0 +1,99 @@ +## Setup OpenTelemetry Binary as an agent + +  + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +``` + +  + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +``` + +  + +### Step 3: Create `config.yaml` in `otelcol-contrib` folder with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-instrumentApplication.md new file mode 100644 index 0000000000..fb85effea3 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-instrumentApplication.md @@ -0,0 +1,68 @@ +After setting up the Otel collector agent, follow the steps below to instrument your .NET Application + +  +  + +### Step 1: Install OpenTelemetry Dependencies +Install the following dependencies in your application. + +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri("http://localhost:4317"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` + +  + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-runApplication.md new file mode 100644 index 0000000000..6a591b202e --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-runApplication.md @@ -0,0 +1,18 @@ +  +Once you are done intrumenting your .NET application, you can run it using the below commands +  + +### Step 1: Run OTel Collector + Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step + +```bash +./otelcol-contrib --config ./config.yaml +``` + +  + +### Step 2: Run your .NET application +```bash +dotnet build +dotnet run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-instrumentApplication.md new file mode 100644 index 0000000000..1783dd2f41 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-instrumentApplication.md @@ -0,0 +1,70 @@ + +### Step 1: Install OpenTelemetry Dependencies +Dependencies related to OpenTelemetry exporter and SDK have to be installed first. + +Run the below commands after navigating to the application source folder: +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + //sigNoz Cloud Endpoint + otlpOptions.Endpoint = new Uri("https://ingest.{{REGION}}.signoz.cloud:443"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + + //SigNoz Cloud account Ingestion key + string headerKey = "signoz-access-token"; + string headerValue = "{{SIGNOZ_INGESTION_KEY}}"; + + string formattedHeader = $"{headerKey}={headerValue}"; + otlpOptions.Headers = formattedHeader; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` + +  + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-runApplication.md new file mode 100644 index 0000000000..556561d63c --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-runApplication.md @@ -0,0 +1,10 @@ +  +To run your .NET application, use the below command : + +```bash +dotnet build +dotnet run +``` + +Once you run your .NET application, interact with your application to generate some load and see your application in the SigNoz UI. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md new file mode 100644 index 0000000000..ef44c0fa80 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md @@ -0,0 +1,97 @@ +## Setup OpenTelemetry Binary as an agent +  + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +``` +  + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +``` + +  + +### Step 3: Create `config.yaml` in folder `otelcol-contrib` with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-instrumentApplication.md new file mode 100644 index 0000000000..5f406890d6 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-instrumentApplication.md @@ -0,0 +1,67 @@ +After setting up the Otel collector agent, follow the steps below to instrument your .NET Application + +  +  + +### Step 1: Install OpenTelemetry Dependencies +Install the following dependencies in your application. + +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri("http://localhost:4317"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` +  + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-runApplication.md new file mode 100644 index 0000000000..6a591b202e --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-runApplication.md @@ -0,0 +1,18 @@ +  +Once you are done intrumenting your .NET application, you can run it using the below commands +  + +### Step 1: Run OTel Collector + Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step + +```bash +./otelcol-contrib --config ./config.yaml +``` + +  + +### Step 2: Run your .NET application +```bash +dotnet build +dotnet run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-instrumentApplication.md new file mode 100644 index 0000000000..1783dd2f41 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-instrumentApplication.md @@ -0,0 +1,70 @@ + +### Step 1: Install OpenTelemetry Dependencies +Dependencies related to OpenTelemetry exporter and SDK have to be installed first. + +Run the below commands after navigating to the application source folder: +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + //sigNoz Cloud Endpoint + otlpOptions.Endpoint = new Uri("https://ingest.{{REGION}}.signoz.cloud:443"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + + //SigNoz Cloud account Ingestion key + string headerKey = "signoz-access-token"; + string headerValue = "{{SIGNOZ_INGESTION_KEY}}"; + + string formattedHeader = $"{headerKey}={headerValue}"; + otlpOptions.Headers = formattedHeader; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` + +  + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-runApplication.md new file mode 100644 index 0000000000..556561d63c --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-runApplication.md @@ -0,0 +1,10 @@ +  +To run your .NET application, use the below command : + +```bash +dotnet build +dotnet run +``` + +Once you run your .NET application, interact with your application to generate some load and see your application in the SigNoz UI. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md new file mode 100644 index 0000000000..66260a66e1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md @@ -0,0 +1,98 @@ +## Setup OpenTelemetry Binary as an agent +  + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +``` + +  + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +``` + +  + +### Step 3: Create `config.yaml` in folder `otelcol-contrib` with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-instrumentApplication.md new file mode 100644 index 0000000000..fb85effea3 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-instrumentApplication.md @@ -0,0 +1,68 @@ +After setting up the Otel collector agent, follow the steps below to instrument your .NET Application + +  +  + +### Step 1: Install OpenTelemetry Dependencies +Install the following dependencies in your application. + +```bash +dotnet add package OpenTelemetry +dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol +dotnet add package OpenTelemetry.Extensions.Hosting +dotnet add package OpenTelemetry.Instrumentation.Runtime +dotnet add package OpenTelemetry.Instrumentation.AspNetCore +dotnet add package OpenTelemetry.AutoInstrumentation +``` + +  + +### Step 2: Adding OpenTelemetry as a service and configuring exporter options + +In your `Program.cs` file, add OpenTelemetry as a service. Here, we are configuring these variables: + +`serviceName` - It is the name of your service. + +`otlpOptions.Endpoint` - It is the endpoint for your OTel Collector agent. + +  + +Here’s a sample `Program.cs` file with the configured variables: + +```bash +using System.Diagnostics; +using OpenTelemetry.Exporter; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +// Configure OpenTelemetry with tracing and auto-start. +builder.Services.AddOpenTelemetry() + .ConfigureResource(resource => + resource.AddService(serviceName: "{{MYAPP}}")) + .WithTracing(tracing => tracing + .AddAspNetCoreInstrumentation() + .AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri("http://localhost:4317"); + + otlpOptions.Protocol = OtlpExportProtocol.Grpc; + })); + +var app = builder.Build(); + +//The index route ("/") is set up to write out the OpenTelemetry trace information on the response: +app.MapGet("/", () => $"Hello World! OpenTelemetry Trace: {Activity.Current?.Id}"); + +app.Run(); +``` + +  + +The OpenTelemetry.Exporter.Options get or set the target to which the exporter is going to send traces. Here, we’re configuring it to send traces to the OTel Collector agent. The target must be a valid Uri with the scheme (http or https) and host and may contain a port and a path. + +This is done by configuring an OpenTelemetry [TracerProvider](https://github.com/open-telemetry/opentelemetry-dotnet/tree/main/docs/trace/customizing-the-sdk#readme) using extension methods and setting it to auto-start when the host is started. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-runApplication.md new file mode 100644 index 0000000000..6a591b202e --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-runApplication.md @@ -0,0 +1,18 @@ +  +Once you are done intrumenting your .NET application, you can run it using the below commands +  + +### Step 1: Run OTel Collector + Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step + +```bash +./otelcol-contrib --config ./config.yaml +``` + +  + +### Step 2: Run your .NET application +```bash +dotnet build +dotnet run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-instrumentApplication.md index 642da55e8b..50906f1d8d 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-instrumentApplication.md @@ -37,7 +37,8 @@ To configure your application to send data we will need a function to initialize import ( ..... - + + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/QuickStart/golang-linuxamd64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/QuickStart/golang-linuxamd64-quickStart-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/QuickStart/golang-linuxamd64-quickStart-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/QuickStart/golang-linuxamd64-quickStart-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/QuickStart/golang-linuxarm64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/QuickStart/golang-linuxarm64-quickStart-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/QuickStart/golang-linuxarm64-quickStart-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/QuickStart/golang-linuxarm64-quickStart-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/QuickStart/golang-macosamd64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/QuickStart/golang-macosamd64-quickStart-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/QuickStart/golang-macosamd64-quickStart-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/QuickStart/golang-macosamd64-quickStart-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/QuickStart/golang-macosarm64-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/QuickStart/golang-macosarm64-quickStart-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/QuickStart/golang-macosarm64-quickStart-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/QuickStart/golang-macosarm64-quickStart-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-instrumentApplication.md index 642da55e8b..f265b09788 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-instrumentApplication.md @@ -38,6 +38,7 @@ To configure your application to send data we will need a function to initialize import ( ..... + "google.golang.org/grpc/credentials" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureAws.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureAws.md new file mode 100644 index 0000000000..4cc35a59f5 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureAws.md @@ -0,0 +1,39 @@ +### Configure AWS + +Create a `~/.aws/credentials` file in the machine which should have `aws_access_key_id` and the `aws_secret_access_key` in the default section of credentials file. + +An example credential file would look like this: +```bash +[default] +aws_access_key_id=AKIAIOSFODNN7EXAMPLE +aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + +[user1] +aws_access_key_id=AKIAI44QH8DHBEXAMPLE +aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY +``` + +**Note:** Replace the `aws_access_key_id`, `aws_secret_access_key`, `aws_access_key_id` and `aws_secret_access_key` with your credential values. + +  + +The account corresponding to these credentials should have the **below-mentioned AWS Identity and Access Management (IAM)** policy. This allows describing and filtering log events across all log groups of that particular AWS account, a crucial step for forwarding CloudWatch logs to SigNoz. + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "logs:DescribeLogGroups", + "logs:FilterLogEvents" + ], + "Resource": "arn:aws:logs:*:090340947446:log-group:*" + } + ] +} +``` + +**Important Note:** Make sure you have AWS configured on the machine where otel-collector is running. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureReceiver.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureReceiver.md new file mode 100644 index 0000000000..8ac226d208 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureReceiver.md @@ -0,0 +1,50 @@ +### Configure awscloudwatch receiver + +Add the `awscloudwatch` receiver in the receivers section of `config.yaml` file of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +  + +You can configure your receiver to collect logs with different conditions. + +  + +Here are two sample configurations: + +- This configuration below will do autodiscovery and collect 100 log groups starting with prefix application. + +```bash + +receivers: +... + awscloudwatch: + region: us-east-1 + logs: + poll_interval: 1m + groups: + autodiscover: + limit: 100 + prefix: application +... + +``` + +- This configuration below will not do autodiscovery and specifies the names of the log groups to collect. +```bash +receivers: +... +awscloudwatch: + profile: 'my-profile' + region: us-west-1 + logs: + poll_interval: 5m + groups: + named: + /aws/eks/dev-0/cluster: + +... +``` + +  + +To know more about the different parameters of awscloudwatch receiver, and see more sample configuration, checkout this [GitHub link](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/awscloudwatchreceiver) + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md new file mode 100644 index 0000000000..19bccd2e6c --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md @@ -0,0 +1,94 @@ +### Setup OpenTelemetry Binary as an agent + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +``` + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +``` + +### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-sendLogs.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-sendLogs.md new file mode 100644 index 0000000000..31b669b53a --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-sendLogs.md @@ -0,0 +1,38 @@ +### Send logs to SigNoz + +To test out the receiver, create a pipeline in the pipeline section of the `config.yaml` of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +```bash +... + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp, awscloudwatch] + processors: [batch] + exporters: [otlp] +``` + +  + +### Run OTel Collector + Run this command inside the `otelcol-contrib` directory : + +```bash +./otelcol-contrib --config ./config.yaml +``` + +You should be able to see your Cloudwatch logs in the logs tabs of SigNoz Cloud UI. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureAws.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureAws.md new file mode 100644 index 0000000000..4cc35a59f5 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureAws.md @@ -0,0 +1,39 @@ +### Configure AWS + +Create a `~/.aws/credentials` file in the machine which should have `aws_access_key_id` and the `aws_secret_access_key` in the default section of credentials file. + +An example credential file would look like this: +```bash +[default] +aws_access_key_id=AKIAIOSFODNN7EXAMPLE +aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + +[user1] +aws_access_key_id=AKIAI44QH8DHBEXAMPLE +aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY +``` + +**Note:** Replace the `aws_access_key_id`, `aws_secret_access_key`, `aws_access_key_id` and `aws_secret_access_key` with your credential values. + +  + +The account corresponding to these credentials should have the **below-mentioned AWS Identity and Access Management (IAM)** policy. This allows describing and filtering log events across all log groups of that particular AWS account, a crucial step for forwarding CloudWatch logs to SigNoz. + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "logs:DescribeLogGroups", + "logs:FilterLogEvents" + ], + "Resource": "arn:aws:logs:*:090340947446:log-group:*" + } + ] +} +``` + +**Important Note:** Make sure you have AWS configured on the machine where otel-collector is running. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureReceiver.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureReceiver.md new file mode 100644 index 0000000000..8ac226d208 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureReceiver.md @@ -0,0 +1,50 @@ +### Configure awscloudwatch receiver + +Add the `awscloudwatch` receiver in the receivers section of `config.yaml` file of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +  + +You can configure your receiver to collect logs with different conditions. + +  + +Here are two sample configurations: + +- This configuration below will do autodiscovery and collect 100 log groups starting with prefix application. + +```bash + +receivers: +... + awscloudwatch: + region: us-east-1 + logs: + poll_interval: 1m + groups: + autodiscover: + limit: 100 + prefix: application +... + +``` + +- This configuration below will not do autodiscovery and specifies the names of the log groups to collect. +```bash +receivers: +... +awscloudwatch: + profile: 'my-profile' + region: us-west-1 + logs: + poll_interval: 5m + groups: + named: + /aws/eks/dev-0/cluster: + +... +``` + +  + +To know more about the different parameters of awscloudwatch receiver, and see more sample configuration, checkout this [GitHub link](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/awscloudwatchreceiver) + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md new file mode 100644 index 0000000000..f82ce3ab23 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md @@ -0,0 +1,95 @@ +### Setup OpenTelemetry Binary as an agent + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +``` + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +``` + +### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-sendLogs.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-sendLogs.md new file mode 100644 index 0000000000..31b669b53a --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-sendLogs.md @@ -0,0 +1,38 @@ +### Send logs to SigNoz + +To test out the receiver, create a pipeline in the pipeline section of the `config.yaml` of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +```bash +... + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp, awscloudwatch] + processors: [batch] + exporters: [otlp] +``` + +  + +### Run OTel Collector + Run this command inside the `otelcol-contrib` directory : + +```bash +./otelcol-contrib --config ./config.yaml +``` + +You should be able to see your Cloudwatch logs in the logs tabs of SigNoz Cloud UI. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureAws.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureAws.md new file mode 100644 index 0000000000..4cc35a59f5 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureAws.md @@ -0,0 +1,39 @@ +### Configure AWS + +Create a `~/.aws/credentials` file in the machine which should have `aws_access_key_id` and the `aws_secret_access_key` in the default section of credentials file. + +An example credential file would look like this: +```bash +[default] +aws_access_key_id=AKIAIOSFODNN7EXAMPLE +aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + +[user1] +aws_access_key_id=AKIAI44QH8DHBEXAMPLE +aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY +``` + +**Note:** Replace the `aws_access_key_id`, `aws_secret_access_key`, `aws_access_key_id` and `aws_secret_access_key` with your credential values. + +  + +The account corresponding to these credentials should have the **below-mentioned AWS Identity and Access Management (IAM)** policy. This allows describing and filtering log events across all log groups of that particular AWS account, a crucial step for forwarding CloudWatch logs to SigNoz. + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "logs:DescribeLogGroups", + "logs:FilterLogEvents" + ], + "Resource": "arn:aws:logs:*:090340947446:log-group:*" + } + ] +} +``` + +**Important Note:** Make sure you have AWS configured on the machine where otel-collector is running. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureReceiver.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureReceiver.md new file mode 100644 index 0000000000..8ac226d208 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureReceiver.md @@ -0,0 +1,50 @@ +### Configure awscloudwatch receiver + +Add the `awscloudwatch` receiver in the receivers section of `config.yaml` file of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +  + +You can configure your receiver to collect logs with different conditions. + +  + +Here are two sample configurations: + +- This configuration below will do autodiscovery and collect 100 log groups starting with prefix application. + +```bash + +receivers: +... + awscloudwatch: + region: us-east-1 + logs: + poll_interval: 1m + groups: + autodiscover: + limit: 100 + prefix: application +... + +``` + +- This configuration below will not do autodiscovery and specifies the names of the log groups to collect. +```bash +receivers: +... +awscloudwatch: + profile: 'my-profile' + region: us-west-1 + logs: + poll_interval: 5m + groups: + named: + /aws/eks/dev-0/cluster: + +... +``` + +  + +To know more about the different parameters of awscloudwatch receiver, and see more sample configuration, checkout this [GitHub link](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/awscloudwatchreceiver) + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md new file mode 100644 index 0000000000..83e8fa1cb9 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md @@ -0,0 +1,94 @@ +### Setup OpenTelemetry Binary as an agent + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +``` + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +``` + +### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-sendLogs.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-sendLogs.md new file mode 100644 index 0000000000..31b669b53a --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-sendLogs.md @@ -0,0 +1,38 @@ +### Send logs to SigNoz + +To test out the receiver, create a pipeline in the pipeline section of the `config.yaml` of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +```bash +... + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp, awscloudwatch] + processors: [batch] + exporters: [otlp] +``` + +  + +### Run OTel Collector + Run this command inside the `otelcol-contrib` directory : + +```bash +./otelcol-contrib --config ./config.yaml +``` + +You should be able to see your Cloudwatch logs in the logs tabs of SigNoz Cloud UI. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureAws.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureAws.md new file mode 100644 index 0000000000..4cc35a59f5 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureAws.md @@ -0,0 +1,39 @@ +### Configure AWS + +Create a `~/.aws/credentials` file in the machine which should have `aws_access_key_id` and the `aws_secret_access_key` in the default section of credentials file. + +An example credential file would look like this: +```bash +[default] +aws_access_key_id=AKIAIOSFODNN7EXAMPLE +aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + +[user1] +aws_access_key_id=AKIAI44QH8DHBEXAMPLE +aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY +``` + +**Note:** Replace the `aws_access_key_id`, `aws_secret_access_key`, `aws_access_key_id` and `aws_secret_access_key` with your credential values. + +  + +The account corresponding to these credentials should have the **below-mentioned AWS Identity and Access Management (IAM)** policy. This allows describing and filtering log events across all log groups of that particular AWS account, a crucial step for forwarding CloudWatch logs to SigNoz. + +```bash +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "logs:DescribeLogGroups", + "logs:FilterLogEvents" + ], + "Resource": "arn:aws:logs:*:090340947446:log-group:*" + } + ] +} +``` + +**Important Note:** Make sure you have AWS configured on the machine where otel-collector is running. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureReceiver.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureReceiver.md new file mode 100644 index 0000000000..8ac226d208 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureReceiver.md @@ -0,0 +1,50 @@ +### Configure awscloudwatch receiver + +Add the `awscloudwatch` receiver in the receivers section of `config.yaml` file of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +  + +You can configure your receiver to collect logs with different conditions. + +  + +Here are two sample configurations: + +- This configuration below will do autodiscovery and collect 100 log groups starting with prefix application. + +```bash + +receivers: +... + awscloudwatch: + region: us-east-1 + logs: + poll_interval: 1m + groups: + autodiscover: + limit: 100 + prefix: application +... + +``` + +- This configuration below will not do autodiscovery and specifies the names of the log groups to collect. +```bash +receivers: +... +awscloudwatch: + profile: 'my-profile' + region: us-west-1 + logs: + poll_interval: 5m + groups: + named: + /aws/eks/dev-0/cluster: + +... +``` + +  + +To know more about the different parameters of awscloudwatch receiver, and see more sample configuration, checkout this [GitHub link](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/awscloudwatchreceiver) + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md new file mode 100644 index 0000000000..0152e03e34 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md @@ -0,0 +1,93 @@ +### Setup OpenTelemetry Binary as an agent + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +``` +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +``` + +### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-sendLogs.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-sendLogs.md new file mode 100644 index 0000000000..31b669b53a --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-sendLogs.md @@ -0,0 +1,38 @@ +### Send logs to SigNoz + +To test out the receiver, create a pipeline in the pipeline section of the `config.yaml` of the **`otecol-contrib`** directory that you created in the Setup Otel Collector Step. + +```bash +... + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp, awscloudwatch] + processors: [batch] + exporters: [otlp] +``` + +  + +### Run OTel Collector + Run this command inside the `otelcol-contrib` directory : + +```bash +./otelcol-contrib --config ./config.yaml +``` + +You should be able to see your Cloudwatch logs in the logs tabs of SigNoz Cloud UI. + + + diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Heroku/md-docs/heroku-addHttpDrain.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Heroku/md-docs/heroku-addHttpDrain.md new file mode 100644 index 0000000000..641d86e596 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Heroku/md-docs/heroku-addHttpDrain.md @@ -0,0 +1,29 @@ + +You can stream logs from Heroku to SigNoz using [httpsdrain](https://devcenter.heroku.com/articles/log-drains#https-drains). + + +  + +### Use the Heroku CLI to add a https drain + + +```bash +heroku drains:add https://:{{SIGNOZ_INGESTION_KEY}}@ingest.{{REGION}}.signoz.cloud:443/logs/heroku -a +``` + +  + +`` should be raplaced with the name of your SigNoz instance. + +For example, if your SigNoz instance URL is `https://cpvo-test.us.signoz.cloud` the `TENANT_NAME` is `cpvo-test`. + + +**Note:** You can find your instance URL in your browser's current tab address bar or in the invite email sent to you. + +  + +`` is the name of the Heroku application where you want to add the drain. + +  + +Once you have successfully added the drain, click on the `Done` button below to see your logs in the SigNoz UI. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Http/md-docs/httpJsonPayload.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Http/md-docs/httpJsonPayload.md new file mode 100644 index 0000000000..c74221dd7a --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Http/md-docs/httpJsonPayload.md @@ -0,0 +1,95 @@ +## Payload Structure + +To send logs to SigNoz over HTTP, we have a payload structure which is an array of JSON logs which adheres to the [OTEL Logs Data Model](https://opentelemetry.io/docs/specs/otel/logs/data-model/). + +  + +The structure of the Payload has the following fields: + +```bash +[ + { + "timestamp": , + "trace_id": , + "span_id": , + "trace_flags": , + "severity_text": , + "severity_number": , + "attributes": , + "resources": , + "body": , + } +] +``` +**Notes:** +* `timestamp` is an int64 representing nanaseconds since the Unix epoch. +* You can use **body** or **message** to denote the log content. + +  + +Any other fields present apart from the ones mentioned above will be moved to the **attributes map**. For example: + +```bash +[ + { + "host": "myhost", + "method": "GET", + "body": "this is a log line" + } +] +``` + +Will be treated as: +```bash +[ + { + "attributes": { + "host": "myhost", + "method": "GET" + }, + "body": "this is a log line" + } +] +``` +  + +## Send logs + +This is a **sample cURL request** which can be used as a template: + +  + +```bash +curl --location 'https://ingest.{{REGION}}.signoz.cloud:443/logs/json/' \ +--header 'Content-Type: application/json' \ +--header 'signoz-access-token: {{SIGNOZ_INGESTION_KEY}}' \ +--data '[ + { + "trace_id": "000000000000000018c51935df0b93b9", + "span_id": "18c51935df0b93b9", + "trace_flags": 0, + "severity_text": "info", + "severity_number": 4, + "attributes": { + "method": "GET", + "path": "/api/users" + }, + "resources": { + "host": "myhost", + "namespace": "prod" + }, + "message": "This is a log line" + } +]' +``` +  + +This curl request will have the timestamp of when you send the above log. + +  + +To specify a particular timestamp in your log, ensure you include the `timestamp` field in your cURL request. Place the timestamp field before the `trace_id` field. For example, `timestamp`: 1698310066000000000 + +  + +**Note:** You can customize the cURL request as needed for your specific use case. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Vercel/md-docs/vercel-setupLogDrains.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Vercel/md-docs/vercel-setupLogDrains.md new file mode 100644 index 0000000000..723fe362a9 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Vercel/md-docs/vercel-setupLogDrains.md @@ -0,0 +1,50 @@ + +You can stream logs from Vercel to SigNoz using [log drains](https://vercel.com/docs/observability/log-drains-overview/log-drains#configure-a-log-drain). + +**Note:** Log Drains are only supported in **Vercel Pro** and **Enterprise accounts**. + +  + +### Step 1: Select Sources + +* From the Vercel dashboard, go to **Team Settings > Log Drains**. + +  + +* Select sources from which you want to collect logs (Example -> Statci, External, Lambda etc.) + +  + +* Choose delivery format as `JSON` + +  + +* Specify your target projects + +  + + +### Step 2: Add Log Drain + +* Enter the endpoint URL as follows: +```bash +https://ingest.{{REGION}}.signoz.cloud:443/logs/json +``` +  + +* Enable **Custom Headers** and add the headers `signoz-access-token` and `x-vercel-verify` +```bash +signoz-access-token: {{SIGNOZ_INGESTION_KEY}} +``` +```bash +x-vercel-verify: +``` +**Note:** The value of `x-vercel-verify` will be visible on your screen in the endpoint section. + +  + +* Click on **Verify** button and then **Add Log Drain** button in Vercel. + +  + +Click on the **Done** button below and you should be able to see your logs in SigNoz. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx b/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx index 867a570677..b1ecfbe6f9 100644 --- a/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx +++ b/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx @@ -67,7 +67,6 @@ export default function MarkdownStep(): JSX.Element { } else if (selectedModule?.id === ModulesMap.InfrastructureMonitoring) { docFilePaths = InfraMonitoringDocFilePaths; } - // @ts-ignore if (docFilePaths && docFilePaths[path]) { // @ts-ignore diff --git a/frontend/src/container/OnboardingContainer/Steps/SelectMethod/SelectMethod.tsx b/frontend/src/container/OnboardingContainer/Steps/SelectMethod/SelectMethod.tsx index e8b8b97d55..79cba00260 100644 --- a/frontend/src/container/OnboardingContainer/Steps/SelectMethod/SelectMethod.tsx +++ b/frontend/src/container/OnboardingContainer/Steps/SelectMethod/SelectMethod.tsx @@ -46,6 +46,11 @@ export default function SelectMethod(): JSX.Element {

diff --git a/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts b/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts index 89def24609..b35bf6ce06 100644 --- a/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts +++ b/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts @@ -7,6 +7,40 @@ /// ////// JavaScript Done /// ///// Go Start // Go-Kubernetes +/// /// ROR Done +/// /// .NET Start +// dotnet-Kubernetes +import APM_dotnet_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-installOtelCollector.md'; +import APM_dotnet_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-instrumentApplication.md'; +import APM_dotnet_kubernetes_recommendedSteps_runApplication from '../Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-runApplication.md'; +// dotnet-LinuxAMD64-quickstart +import APM_dotnet_linuxAMD64_quickStart_instrumentApplication from '../Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-instrumentApplication.md'; +import APM_dotnet_linuxAMD64_quickStart_runApplication from '../Modules/APM/Dotnet/md-docs/LinuxAMD64/QuickStart/dotnet-linuxamd64-quickStart-runApplication.md'; +// dotnet-LinuxAMD64-recommended +import APM_dotnet_linuxAMD64_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md'; +import APM_dotnet_linuxAMD64_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-instrumentApplication.md'; +import APM_dotnet_linuxAMD64_recommendedSteps_runApplication from '../Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-runApplication.md'; +// dotnet-LinuxARM64-quickstart +import APM_dotnet_linuxARM64_quickStart_instrumentApplication from '../Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-instrumentApplication.md'; +import APM_dotnet_linuxARM64_quickStart_runApplication from '../Modules/APM/Dotnet/md-docs/LinuxARM64/QuickStart/dotnet-linuxarm64-quickStart-runApplication.md'; +// dotnet-LinuxARM64-recommended +import APM_dotnet_linuxARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md'; +import APM_dotnet_linuxARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-instrumentApplication.md'; +import APM_dotnet_linuxARM64_recommendedSteps_runApplication from '../Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-runApplication.md'; +// dotnet-MacOsAMD64-quickstart +import APM_dotnet_macOsAMD64_quickStart_instrumentApplication from '../Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-instrumentApplication.md'; +import APM_dotnet_macOsAMD64_quickStart_runApplication from '../Modules/APM/Dotnet/md-docs/MacOsAMD64/QuickStart/dotnet-macosamd64-quickStart-runApplication.md'; +// dotnet-MacOsAMD64-recommended +import APM_dotnet_macOsAMD64_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md'; +import APM_dotnet_macOsAMD64_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-instrumentApplication.md'; +import APM_dotnet_macOsAMD64_recommendedSteps_runApplication from '../Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-runApplication.md'; +// dotnet-MacOsARM64-quickstart +import APM_dotnet_macOsARM64_quickStart_instrumentApplication from '../Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-instrumentApplication.md'; +import APM_dotnet_macOsARM64_quickStart_runApplication from '../Modules/APM/Dotnet/md-docs/MacOsARM64/QuickStart/dotnet-macosarm64-quickStart-runApplication.md'; +// dotnet-MacOsARM64-recommended +import APM_dotnet_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md'; +import APM_dotnet_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-instrumentApplication.md'; +import APM_dotnet_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-runApplication.md'; import APM_go_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-installOtelCollector.md'; import APM_go_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-instrumentApplication.md'; import APM_go_kubernetes_recommendedSteps_runApplication from '../Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-runApplication.md'; @@ -1100,7 +1134,7 @@ export const ApmDocFilePaths = { APM_rails_linuxARM64_recommendedSteps_instrumentApplication, APM_rails_linuxARM64_recommendedSteps_runApplication, - // ROR-LinuxARM64-quinestjs + // ROR-LinuxARM64-quickstart APM_rails_linuxARM64_quickStart_instrumentApplication, APM_rails_linuxARM64_quickStart_runApplication, @@ -1121,4 +1155,51 @@ export const ApmDocFilePaths = { // ROR-MacOsARM64-quickstart APM_rails_macOsARM64_quickStart_instrumentApplication, APM_rails_macOsARM64_quickStart_runApplication, + + // ------------------------------------------------------------------------------------------------ + + /// //// ROR Done + + /// //// .NET Start + + // ROR-Kubernetes + APM_dotnet_kubernetes_recommendedSteps_setupOtelCollector, + APM_dotnet_kubernetes_recommendedSteps_instrumentApplication, + APM_dotnet_kubernetes_recommendedSteps_runApplication, + + // ROR-LinuxAMD64-quickstart + APM_dotnet_linuxAMD64_quickStart_instrumentApplication, + APM_dotnet_linuxAMD64_quickStart_runApplication, + + // ROR-LinuxAMD64-recommended + APM_dotnet_linuxAMD64_recommendedSteps_setupOtelCollector, + APM_dotnet_linuxAMD64_recommendedSteps_instrumentApplication, + APM_dotnet_linuxAMD64_recommendedSteps_runApplication, + + // ROR-LinuxARM64-quickstart + APM_dotnet_linuxARM64_quickStart_instrumentApplication, + APM_dotnet_linuxARM64_quickStart_runApplication, + + // ROR-LinuxARM64-recommended + APM_dotnet_linuxARM64_recommendedSteps_setupOtelCollector, + APM_dotnet_linuxARM64_recommendedSteps_instrumentApplication, + APM_dotnet_linuxARM64_recommendedSteps_runApplication, + + // ROR-MacOsAMD64-quickstart + APM_dotnet_macOsAMD64_quickStart_instrumentApplication, + APM_dotnet_macOsAMD64_quickStart_runApplication, + + // ROR-MacOsAMD64-recommended + APM_dotnet_macOsAMD64_recommendedSteps_setupOtelCollector, + APM_dotnet_macOsAMD64_recommendedSteps_instrumentApplication, + APM_dotnet_macOsAMD64_recommendedSteps_runApplication, + + // ROR-MacOsARM64-quickstart + APM_dotnet_macOsARM64_quickStart_instrumentApplication, + APM_dotnet_macOsARM64_quickStart_runApplication, + + // ROR-MacOsARM64-recommended + APM_dotnet_macOsARM64_recommendedSteps_setupOtelCollector, + APM_dotnet_macOsARM64_recommendedSteps_instrumentApplication, + APM_dotnet_macOsARM64_recommendedSteps_runApplication, }; diff --git a/frontend/src/container/OnboardingContainer/constants/logsManagementDocFilePaths.ts b/frontend/src/container/OnboardingContainer/constants/logsManagementDocFilePaths.ts index d357edf7ef..1878ec0e7d 100644 --- a/frontend/src/container/OnboardingContainer/constants/logsManagementDocFilePaths.ts +++ b/frontend/src/container/OnboardingContainer/constants/logsManagementDocFilePaths.ts @@ -121,6 +121,40 @@ import LogsManagement_logStash_macOsARM64_setupOtelCollector from '../Modules/Lo import LogsManagement_logStash_macOsARM64_configureReceiver from '../Modules/LogsManagement/Logstash/md-docs/MacOsARM64/logstash-macosarm64-configureReceiver.md'; import LogsManagement_logStash_macOsARM64_restartOtelCollector from '../Modules/LogsManagement/Logstash/md-docs/MacOsARM64/logstash-macosarm64-restartOtelCollector.md'; +// Heroku + +import LogsManagement_heroku_addHttpDrain from '../Modules/LogsManagement/Heroku/md-docs/heroku-addHttpDrain.md'; + +// Vercel + +import LogsManagement_vercel_setupLogDrains from '../Modules/LogsManagement/Vercel/md-docs/vercel-setupLogDrains.md'; + +// HTTP + +import LogsManagement_http_createHttpPayload from '../Modules/LogsManagement/Http/md-docs/httpJsonPayload.md'; + +// Cloudwatch + +import LogsManagement_cloudwatch_linuxAMD64_setupOtelCollector from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md'; +import LogsManagement_cloudwatch_linuxAMD64_configureAws from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureAws.md'; +import LogsManagement_cloudwatch_linuxAMD64_configureReceiver from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-configureReceiver.md'; +import LogsManagement_cloudwatch_linuxAMD64_sendLogsCloudwatch from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-sendLogs.md'; + +import LogsManagement_cloudwatch_linuxARM64_setupOtelCollector from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md'; +import LogsManagement_cloudwatch_linuxARM64_configureAws from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureAws.md'; +import LogsManagement_cloudwatch_linuxARM64_configureReceiver from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-configureReceiver.md'; +import LogsManagement_cloudwatch_linuxARM64_sendLogsCloudwatch from '../Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-sendLogs.md'; + +import LogsManagement_cloudwatch_macOsAMD64_setupOtelCollector from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md'; +import LogsManagement_cloudwatch_macOsAMD64_configureAws from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureAws.md'; +import LogsManagement_cloudwatch_macOsAMD64_configureReceiver from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-configureReceiver.md'; +import LogsManagement_cloudwatch_macOsAMD64_sendLogsCloudwatch from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-sendLogs.md'; + +import LogsManagement_cloudwatch_macOsARM64_setupOtelCollector from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md'; +import LogsManagement_cloudwatch_macOsARM64_configureAws from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureAws.md'; +import LogsManagement_cloudwatch_macOsARM64_configureReceiver from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-configureReceiver.md'; +import LogsManagement_cloudwatch_macOsARM64_sendLogsCloudwatch from '../Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-sendLogs.md'; + export const LogsManagementDocFilePaths = { // Kubernetes Pod Logs LogsManagement_kubernetes_setupOtelCollector, @@ -235,5 +269,36 @@ export const LogsManagementDocFilePaths = { LogsManagement_logStash_macOsARM64_setupOtelCollector, LogsManagement_logStash_macOsARM64_configureReceiver, LogsManagement_logStash_macOsARM64_restartOtelCollector, + + // Heroku + LogsManagement_heroku_addHttpDrain, // ------------------------------------------------------------------------------------------------ + + // Vercel + LogsManagement_vercel_setupLogDrains, + + // HTTP + LogsManagement_http_createHttpPayload, + + // Cloudwatch + + LogsManagement_cloudwatch_linuxAMD64_setupOtelCollector, + LogsManagement_cloudwatch_linuxAMD64_configureAws, + LogsManagement_cloudwatch_linuxAMD64_configureReceiver, + LogsManagement_cloudwatch_linuxAMD64_sendLogsCloudwatch, + + LogsManagement_cloudwatch_linuxARM64_setupOtelCollector, + LogsManagement_cloudwatch_linuxARM64_configureAws, + LogsManagement_cloudwatch_linuxARM64_configureReceiver, + LogsManagement_cloudwatch_linuxARM64_sendLogsCloudwatch, + + LogsManagement_cloudwatch_macOsAMD64_setupOtelCollector, + LogsManagement_cloudwatch_macOsAMD64_configureAws, + LogsManagement_cloudwatch_macOsAMD64_configureReceiver, + LogsManagement_cloudwatch_macOsAMD64_sendLogsCloudwatch, + + LogsManagement_cloudwatch_macOsARM64_setupOtelCollector, + LogsManagement_cloudwatch_macOsARM64_configureAws, + LogsManagement_cloudwatch_macOsARM64_configureReceiver, + LogsManagement_cloudwatch_macOsARM64_sendLogsCloudwatch, }; diff --git a/frontend/src/container/OnboardingContainer/constants/stepsConfig.tsx b/frontend/src/container/OnboardingContainer/constants/stepsConfig.tsx index 8e5501348e..95039b9d18 100644 --- a/frontend/src/container/OnboardingContainer/constants/stepsConfig.tsx +++ b/frontend/src/container/OnboardingContainer/constants/stepsConfig.tsx @@ -22,6 +22,11 @@ export const stepsMap = { plotMetrics: 'plotMetrics', configureHostmetricsJson: 'configureHostmetricsJson', configureMetricsReceiver: 'configureMetricsReceiver', + addHttpDrain: 'addHttpDrain', + setupLogDrains: `setupLogDrains`, + createHttpPayload: `createHttpPayload`, + configureAws: `configureAws`, + sendLogsCloudwatch: `sendLogsCloudwatch`, }; export const DataSourceStep: SelectedModuleStepProps = { @@ -119,3 +124,32 @@ export const ConfigureMetricsReceiver: SelectedModuleStepProps = { title: 'Configure Metrics Receiver', component: , }; + +export const AddHttpDrain: SelectedModuleStepProps = { + id: stepsMap.addHttpDrain, + title: 'Add HTTP Drain', + component: , +}; + +export const SetupLogDrains: SelectedModuleStepProps = { + id: stepsMap.setupLogDrains, + title: 'Setup Log Drains', + component: , +}; + +export const CreateHttpPayload: SelectedModuleStepProps = { + id: stepsMap.createHttpPayload, + title: 'Create Json Payload', + component: , +}; + +export const ConfigureAws: SelectedModuleStepProps = { + id: stepsMap.configureAws, + title: 'Configure AWS', + component: , +}; +export const SendLogsCloudwatch: SelectedModuleStepProps = { + id: stepsMap.sendLogsCloudwatch, + title: 'Send Logs', + component: , +}; diff --git a/frontend/src/container/OnboardingContainer/context/OnboardingContext.tsx b/frontend/src/container/OnboardingContainer/context/OnboardingContext.tsx index c566be84ea..79dbe8ba19 100644 --- a/frontend/src/container/OnboardingContainer/context/OnboardingContext.tsx +++ b/frontend/src/container/OnboardingContainer/context/OnboardingContext.tsx @@ -54,7 +54,7 @@ function OnboardingContextProvider({ const [selectedFramework, setSelectedFramework] = useState(''); const [selectedMethod, setSelectedMethod] = useState( - OnboardingMethods.RECOMMENDED_STEPS, + OnboardingMethods.QUICK_START, ); const [ diff --git a/frontend/src/container/OnboardingContainer/utils/dataSourceUtils.ts b/frontend/src/container/OnboardingContainer/utils/dataSourceUtils.ts index b157d142bc..68b5004952 100644 --- a/frontend/src/container/OnboardingContainer/utils/dataSourceUtils.ts +++ b/frontend/src/container/OnboardingContainer/utils/dataSourceUtils.ts @@ -94,6 +94,11 @@ const supportedLanguages = [ id: 'rails', imgURL: `Logos/rails.png`, }, + { + name: '.NET', + id: 'dotnet', + imgURL: `Logos/dotnet.png`, + }, ]; export const defaultLogsType = { @@ -138,6 +143,26 @@ const supportedLogsTypes = [ id: 'logStash', imgURL: `Logos/logstash.svg`, }, + { + name: 'Heroku', + id: 'heroku', + imgURL: `Logos/heroku.png`, + }, + { + name: 'Vercel', + id: 'vercel', + imgURL: `Logos/vercel.png`, + }, + { + name: 'HTTP', + id: 'http', + imgURL: `Logos/http.png`, + }, + { + name: 'Cloudwatch', + id: 'cloudwatch', + imgURL: `Logos/cloudwatch.png`, + }, ]; export const defaultInfraMetricsType = { @@ -188,7 +213,8 @@ export const getSupportedFrameworks = ({ if ( (moduleID === ModulesMap.APM && dataSourceName === 'go') || - (moduleID === ModulesMap.APM && dataSourceName === 'rails') + (moduleID === ModulesMap.APM && dataSourceName === 'rails') || + (moduleID === ModulesMap.APM && dataSourceName === '.NET') ) { return []; } @@ -213,7 +239,8 @@ export const hasFrameworks = ({ moduleID === ModulesMap.LogsManagement || moduleID === ModulesMap.InfrastructureMonitoring || (moduleID === ModulesMap.APM && dataSourceName === 'go') || - (moduleID === ModulesMap.APM && dataSourceName === 'rails') + (moduleID === ModulesMap.APM && dataSourceName === 'rails') || + (moduleID === ModulesMap.APM && dataSourceName === '.NET') ) { return false; } diff --git a/frontend/src/container/OnboardingContainer/utils/getSteps.ts b/frontend/src/container/OnboardingContainer/utils/getSteps.ts index 9c11fe0085..5d3baa08b8 100644 --- a/frontend/src/container/OnboardingContainer/utils/getSteps.ts +++ b/frontend/src/container/OnboardingContainer/utils/getSteps.ts @@ -1,9 +1,12 @@ import { + AddHttpDrain, CheckServiceStatus, CloneRepo, + ConfigureAws, ConfigureHostmetricsJSON, ConfigureMetricsReceiver, ConfigureReceiver, + CreateHttpPayload, DataSourceStep, EnvDetailsStep, InstallOpenTelemetryStep, @@ -12,6 +15,8 @@ import { RestartOtelCollector, RunApplicationStep, SelectMethodStep, + SendLogsCloudwatch, + SetupLogDrains, SetupOtelCollectorStep, StartContainer, TestConnectionStep, @@ -74,6 +79,21 @@ export const getSteps = ({ ConfigureReceiver, RestartOtelCollector, ]; + case 'heroku': + return [DataSourceStep, AddHttpDrain]; + case 'vercel': + return [DataSourceStep, SetupLogDrains]; + case 'http': + return [DataSourceStep, CreateHttpPayload]; + case 'cloudwatch': + return [ + DataSourceStep, + EnvDetailsStep, + SetupOtelCollectorStep, + ConfigureAws, + ConfigureReceiver, + SendLogsCloudwatch, + ]; case 'kubernetesInfraMetrics': return [DataSourceStep, SetupOtelCollectorStep, PlotMetrics];