spec/elastic_apm/spies/dynamo_db_spec.rb (68 lines of code) (raw):
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# frozen_string_literal: true
require "spec_helper"
require "aws-sdk-dynamodb"
module ElasticAPM
RSpec.describe "Spy: DynamoDB" do
let(:dynamo_db_client) do
::Aws::DynamoDB::Client.new(stub_responses: true, region: "us-west-1")
end
it "spans operations", :intercept do
with_agent do
ElasticAPM.with_transaction do
dynamo_db_client.delete_item(table_name: "test", key: {})
end
end
span = @intercepted.spans.first
expect(span.name).to eq("DynamoDB DeleteItem test")
expect(span.type).to eq("db")
expect(span.subtype).to eq("dynamodb")
expect(span.action).to eq("query")
expect(span.outcome).to eq("success")
# span context db
expect(span.context.db.instance).to eq("us-west-1")
expect(span.context.db.statement).to be(nil)
expect(span.context.db.type).to eq("dynamodb")
# span context destination
expect(span.context.destination.address).to eq("dynamodb.us-west-1.amazonaws.com")
expect(span.context.destination.port).to eq(443)
expect(span.context.destination.service.name).to eq("dynamodb")
expect(span.context.destination.service.type).to eq("db")
expect(span.context.destination.service.resource).to eq("dynamodb")
expect(span.context.destination.cloud.region).to eq("us-west-1")
end
it "omits the table name when there is none", :intercept do
with_agent do
ElasticAPM.with_transaction do
dynamo_db_client.describe_backup(backup_arn: "test-arn")
end
end
span = @intercepted.spans.first
expect(span.name).to eq("DynamoDB DescribeBackup")
end
it "captures the key_condition_expression for queries", :intercept do
with_agent do
ElasticAPM.with_transaction do
dynamo_db_client.query(
table_name: "myTable",
key_condition_expression: "Artist = :v1"
)
end
end
span = @intercepted.spans.first
expect(span.name).to eq("DynamoDB Query myTable")
expect(span.context.db.statement).to eq("Artist = :v1")
end
context("when the operation fails") do
it "sets span outcome to `failure`", :intercept do
with_agent do
ElasticAPM.with_transaction do
begin
dynamo_db_client.batch_get_item({})
rescue
end
end
end
span = @intercepted.spans.first
expect(span.name).to eq("DynamoDB BatchGetItem")
expect(span.outcome).to eq("failure")
end
end
end
end