Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 14 additions & 28 deletions .github/workflows/build_publish_lambda_layer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,7 @@ jobs:
# build layer on arm64 and amd64, then upload to artifacts
# act -j build_layer --container-architecture linux/arm64
build_layer:
strategy:
matrix:
arch:
- x86_64
- arm64

runs-on: ${{ matrix.arch == 'arm64' && fromJSON('{"group":"apm-arm-runner"}') || 'ubuntu-latest' }}
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
Expand All @@ -51,7 +45,6 @@ jobs:
working-directory: lambda/
env:
GITHUB_RUBY_TOKEN: ${{ secrets.PACKAGE_GITHUB_TOKEN }}
MATRIX_ARCH: ${{ matrix.arch }}
SOLARWINDS_SOURCE: ${{ github.event.inputs.solarwinds-source }}

- name: Show directory contents
Expand All @@ -62,8 +55,8 @@ jobs:
- name: Upload to artifact
uses: actions/upload-artifact@v4
with:
name: ruby-layer-${{ matrix.arch }}.zip
path: lambda/build/ruby-layer-${{ matrix.arch }}.zip
name: ruby-layer.zip
path: lambda/build/ruby-layer.zip

# extract the built layer from artifacts, then scan it with reverselab
reverselab_scan_layer:
Expand All @@ -72,39 +65,35 @@ jobs:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch:
- x86_64
- arm64

steps:
- uses: actions/checkout@v4

- name: extract layer zip from artifacts
uses: actions/download-artifact@v4
with:
name: ruby-layer-${{ matrix.arch }}.zip
name: ruby-layer.zip
path: lambda

- name: extract current solarwinds_apm version
run: |
APM_VERSION=$(grep "gem 'solarwinds_apm'" lambda/otel/layer/Gemfile | awk -F"'" '{print $4}')
echo "SOLARWINDS_APM_VERSION=$APM_VERSION" >> $GITHUB_ENV

- name: Scan build artifact on the Portal ${{ matrix.arch }}
- name: Scan build artifact on the Portal
id: rl-scan

env:
RLPORTAL_ACCESS_TOKEN: ${{ secrets.REVERSE_LAB_TOKEN }}

uses: reversinglabs/gh-action-rl-scanner-cloud-only@v1
with:
artifact-to-scan: ./lambda/ruby-layer-${{ matrix.arch }}.zip
artifact-to-scan: ./lambda/ruby-layer.zip
rl-verbose: true
rl-portal-server: solarwinds
rl-portal-org: SolarWinds
rl-portal-group: SaaS-Agents-SWO
rl-package-url: solarwinds-apm-ruby/apm-ruby-lambda-layer-${{ matrix.arch }}@${{ env.SOLARWINDS_APM_VERSION }}
rl-package-url: solarwinds-apm-ruby/apm-ruby-lambda-layer@${{ env.SOLARWINDS_APM_VERSION }}

- name: report the scan status
if: success() || failure()
Expand Down Expand Up @@ -136,9 +125,7 @@ jobs:
- us-east-2
- us-west-1
- us-west-2
arch:
- x86_64
- arm64

steps:
- uses: actions/checkout@v4

Expand All @@ -151,7 +138,7 @@ jobs:
- name: extract layer zip from artifacts
uses: actions/download-artifact@v4
with:
name: ruby-layer-${{ matrix.arch }}.zip
name: ruby-layer.zip
path: lambda

- name: extract current solarwinds_apm version
Expand All @@ -164,18 +151,17 @@ jobs:
run: |
cd lambda/
aws lambda publish-layer-version \
--layer-name solarwinds-apm-ruby-${{ matrix.arch }}-${{ env.SOLARWINDS_APM_VERSION }} \
--layer-name solarwinds-apm-ruby-${{ env.SOLARWINDS_APM_VERSION }} \
--license-info "Apache 2.0" \
--compatible-architectures ${{ matrix.arch }} \
--compatible-runtimes ruby3.2 ruby3.3 \
--zip-file fileb://ruby-layer-${{ matrix.arch }}.zip \
--compatible-architectures x86_64 arm64 \
--compatible-runtimes ruby3.2 ruby3.3 ruby3.4 \
--zip-file fileb://ruby-layer.zip \
--query 'LayerVersionArn' \
--compatible-architectures ${{ matrix.arch }} \
--output text

- name: grant permissions to public for the published layer
run: |
layer_name=solarwinds-apm-ruby-${{ matrix.arch }}-${{ env.SOLARWINDS_APM_VERSION }}
layer_name=solarwinds-apm-ruby-${{ env.SOLARWINDS_APM_VERSION }}
latest_version=$(aws lambda list-layer-versions --layer-name $layer_name | jq -r '.LayerVersions | max_by(.Version) | .Version')
aws lambda add-layer-version-permission \
--layer-name $layer_name \
Expand Down
32 changes: 9 additions & 23 deletions lambda/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,18 @@ fi

mkdir -p build

docker build --no-cache \
--build-arg BUNDLE_RUBYGEMS__PKG__GITHUB__COM=${GITHUB_RUBY_TOKEN} \
--progress plain \
-f otel/Dockerfile_3_2 \
-t sw-lambda-ruby-layer-3-2 otel
for ruby_version in 3.2 3.3 3.4; do
docker build --no-cache \
--build-arg RUBY_VERSION=${ruby_version} \
--progress plain \
-f otel/Dockerfile \
-t sw-lambda-ruby-layer-${ruby_version} otel

docker run --rm -v "$(pwd)/build:/out" sw-lambda-ruby-layer-3-2

docker build --no-cache \
--build-arg BUNDLE_RUBYGEMS__PKG__GITHUB__COM=${GITHUB_RUBY_TOKEN} \
--progress plain \
-f otel/Dockerfile_3_3 \
-t sw-lambda-ruby-layer-3-3 otel

docker run --rm -v "$(pwd)/build:/out" sw-lambda-ruby-layer-3-3

docker build --no-cache \
--build-arg BUNDLE_RUBYGEMS__PKG__GITHUB__COM=${GITHUB_RUBY_TOKEN} \
--progress plain \
-f otel/Dockerfile_3_4 \
-t sw-lambda-ruby-layer-3-4 otel

docker run --rm -v "$(pwd)/build:/out" sw-lambda-ruby-layer-3-4
docker run --rm -v "$(pwd)/build:/out" sw-lambda-ruby-layer-${ruby_version}
done

cd build/
mkdir solarwinds-apm && mkdir ruby && mkdir ruby/gems
unzip -q gems-3.2.0.zip -d ruby/gems/ && unzip -q gems-3.3.0.zip -d ruby/gems/ && unzip -q gems-3.4.0.zip -d ruby/gems/
cp ../otel/layer/otel_wrapper.rb . && cp ../otel/layer/wrapper solarwinds-apm/
zip -qr ruby-layer-$MATRIX_ARCH.zip ruby/ solarwinds-apm/ otel_wrapper.rb
zip -qr ruby-layer.zip ruby/ solarwinds-apm/ otel_wrapper.rb
46 changes: 46 additions & 0 deletions lambda/otel/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
ARG RUBY_VERSION
FROM public.ecr.aws/sam/build-ruby${RUBY_VERSION}:latest

ARG RUBY_VERSION
ENV RUBY_VERSION=${RUBY_VERSION}

RUN mkdir /build
COPY . /build

WORKDIR /build/layer
RUN bundle config set --local path 'ruby'

# Save gem filename if present
RUN ls | grep solarwinds_apm-*.gem > gem_file.txt 2>/dev/null || true

# Install dependencies
RUN bundle update

# Install wget
RUN sh -c '(command -v dnf && dnf install -y wget) || (command -v yum && yum install -y wget)'

# Install aarch64 version of protobuf gem
ENV ARCH=aarch64
RUN PROTOBUF_VERSION=$(bundle exec ruby -e 'puts Gem.loaded_specs["google-protobuf"].version.to_s') && \
wget "https://rubygems.org/downloads/google-protobuf-${PROTOBUF_VERSION}-${ARCH}-linux-gnu.gem" && \
bundle exec gem install "google-protobuf-${PROTOBUF_VERSION}-${ARCH}-linux-gnu.gem"

# Install solarwinds_apm gem (from file, if exists; for local build only)
RUN gem_file=$(cat gem_file.txt) && \
if [ -f "$gem_file" ]; then \
gem install $gem_file; \
bundle exec gem uninstall solarwinds_apm; \
mv /var/lang/lib/ruby/gems/${RUBY_VERSION}.0/gems/solarwinds_apm-*/ /build/layer/ruby/ruby/${RUBY_VERSION}.0/gems/; \
mv /var/lang/lib/ruby/gems/${RUBY_VERSION}.0/specifications/solarwinds_apm-* /build/layer/ruby/ruby/${RUBY_VERSION}.0/specifications/; \
fi

# Clean up cache and docs
RUN rm -rf /build/layer/ruby/ruby/${RUBY_VERSION}.0/cache/* && \
rm -rf /build/layer/ruby/ruby/${RUBY_VERSION}.0/doc/*

# Zip the layer
WORKDIR /build/layer/ruby/ruby

RUN zip -qr gems-${RUBY_VERSION}.0.zip ${RUBY_VERSION}.0/

CMD cp /build/layer/ruby/ruby/gems-${RUBY_VERSION}.0.zip /out/gems-${RUBY_VERSION}.0.zip
28 changes: 0 additions & 28 deletions lambda/otel/Dockerfile_3_2

This file was deleted.

28 changes: 0 additions & 28 deletions lambda/otel/Dockerfile_3_3

This file was deleted.

28 changes: 0 additions & 28 deletions lambda/otel/Dockerfile_3_4

This file was deleted.

14 changes: 14 additions & 0 deletions lib/solarwinds_apm/opentelemetry/otlp_processor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,20 @@ def on_finish(span)
SolarWindsAPM.logger.info { "[#{self.class}/#{__method__}] error processing span on_finish: #{e.message}" }
end

# @param [optional Numeric] timeout An optional timeout in seconds.
# @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if
# a non-specific failure occurred, Export::TIMEOUT if a timeout occurred.
def force_flush(timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
::OpenTelemetry::SDK::Trace::Export::SUCCESS
end

# @param [optional Numeric] timeout An optional timeout in seconds.
# @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if
# a non-specific failure occurred, Export::TIMEOUT if a timeout occurred.
def shutdown(timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
::OpenTelemetry::SDK::Trace::Export::SUCCESS
end

private

def meter_attributes(span)
Expand Down