chore: Reduce dependencies and binary size, add circle ci detector (#26522)

* chore: add circle ci detector

* update deps

* adjust deps and cleanup binary?

* Add Tests

* fix tests, keep artifact

* Apply suggestions from code review

Co-authored-by: Bill Glesias <bglesias@gmail.com>

---------

Co-authored-by: Bill Glesias <bglesias@gmail.com>
This commit is contained in:
Matt Henkes
2023-04-17 15:44:40 -05:00
committed by GitHub
parent 1ed2031faa
commit 2a8d078753
7 changed files with 239 additions and 892 deletions

View File

@@ -136,7 +136,7 @@ commands:
- run:
name: Check current branch to persist artifacts
command: |
if [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "release/"* && "$CIRCLE_BRANCH" != "update-v8-snapshot-cache-on-develop" ]]; then
if [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "release/"* && "$CIRCLE_BRANCH" != "update-v8-snapshot-cache-on-develop" && "$CIRCLE_BRANCH" != "matth/chore/add-circle-ci-detector" ]]; then
echo "Not uploading artifacts or posting install comment for this branch."
circleci-agent step halt
fi
@@ -493,7 +493,6 @@ commands:
# internal PR
CYPRESS_RECORD_KEY=$MAIN_RECORD_KEY \
CYPRESS_INTERNAL_ENABLE_TELEMETRY="true" \
OTEL_RESOURCE_ATTRIBUTES="ci.branch=$CIRCLE_BRANCH,ci.job=$CIRCLE_JOB,ci.node-index=$CIRCLE_NODE_INDEX,ci.circle=$CIRCLECI,ci.build-url=$CIRCLE_BUILD_URL,ci.build-number=$CIRCLE_BUILD_NUM" \
yarn cypress:run --record --parallel --group 5x-driver-<<parameters.browser>> --browser <<parameters.browser>>
else
# external PR
@@ -567,7 +566,6 @@ commands:
PERCY_ENABLE=${PERCY_TOKEN:-0} \
PERCY_PARALLEL_TOTAL=-1 \
CYPRESS_INTERNAL_ENABLE_TELEMETRY="true" \
OTEL_RESOURCE_ATTRIBUTES="ci.branch=$CIRCLE_BRANCH,ci.job=$CIRCLE_JOB,ci.node-index=$CIRCLE_NODE_INDEX,ci.circle=$CIRCLECI,ci.build-url=$CIRCLE_BUILD_URL,ci.build-number=$CIRCLE_BUILD_NUM" \
$cmd yarn workspace @packages/<<parameters.package>> cypress:run:<<parameters.type>> --browser <<parameters.browser>> --record --parallel --group <<parameters.package>>-<<parameters.type>>
else
# external PR

View File

@@ -16,13 +16,14 @@
},
"dependencies": {
"@opentelemetry/api": "1.4.1",
"@opentelemetry/auto-instrumentations-node": "0.36.4",
"@opentelemetry/exporter-trace-otlp-http": "0.36.1",
"@opentelemetry/instrumentation": "0.36.1",
"@opentelemetry/otlp-exporter-base": "0.36.1",
"@opentelemetry/sdk-trace-base": "1.10.1",
"@opentelemetry/sdk-trace-node": "1.10.1",
"@opentelemetry/sdk-trace-web": "1.10.1"
"@opentelemetry/core": "1.12.0",
"@opentelemetry/exporter-trace-otlp-http": "0.38.0",
"@opentelemetry/otlp-exporter-base": "0.38.0",
"@opentelemetry/resources": "1.12.0",
"@opentelemetry/sdk-trace-base": "1.12.0",
"@opentelemetry/sdk-trace-node": "1.12.0",
"@opentelemetry/sdk-trace-web": "1.12.0",
"@opentelemetry/semantic-conventions": "1.12.0"
},
"devDependencies": {
"@packages/ts": "0.0.0-development",

View File

@@ -0,0 +1,35 @@
import type { DetectorSync, ResourceAttributes, IResource } from '@opentelemetry/resources'
import { Resource } from '@opentelemetry/resources'
/**
* CircleCiDetectorSync can be used to detect the presence of and create a Resource
* from circle ci env variables.
*/
class CircleCiDetectorSync implements DetectorSync {
/**
* Returns a {@link Resource} populated with attributes from the
* circle ci environment variable.
*
* @param config The resource detection config -- ignored
*/
detect (): IResource {
const attributes: ResourceAttributes = {}
const { CIRCLECI, CIRCLE_BRANCH, CIRCLE_JOB, CIRCLE_NODE_INDEX, CIRCLE_BUILD_URL, CIRCLE_BUILD_NUM, CIRCLE_SHA1, CIRCLE_PR_NUMBER } = process.env
if (CIRCLECI) {
attributes['ci.circle'] = CIRCLECI
attributes['ci.branch'] = CIRCLE_BRANCH
attributes['ci.job'] = CIRCLE_JOB
attributes['ci.node'] = CIRCLE_NODE_INDEX
attributes['ci.build-url'] = CIRCLE_BUILD_URL
attributes['ci.build-number'] = CIRCLE_BUILD_NUM
attributes['SHA1'] = CIRCLE_SHA1
attributes['ci.pr-number'] = CIRCLE_PR_NUMBER
}
return new Resource(attributes)
}
}
export const circleCiDetectorSync = new CircleCiDetectorSync()

View File

@@ -3,6 +3,7 @@ import type { startSpanOptions, findActiveSpanOptions, contextObject } from './i
import { Telemetry as TelemetryClass, TelemetryNoop } from './index'
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'
import { envDetectorSync, processDetectorSync, osDetectorSync, hostDetectorSync } from '@opentelemetry/resources'
import { circleCiDetectorSync } from './detectors/circleCiDetectorSync'
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
import { OTLPTraceExporter as OTLPTraceExporterIpc } from './span-exporters/ipc-span-exporter'
@@ -50,7 +51,7 @@ const init = ({
namespace,
Provider: NodeTracerProvider,
detectors: [
envDetectorSync, processDetectorSync, osDetectorSync, hostDetectorSync,
envDetectorSync, processDetectorSync, osDetectorSync, hostDetectorSync, circleCiDetectorSync,
],
rootContextObject: context,
version,

View File

@@ -0,0 +1,107 @@
import { expect } from 'chai'
import { circleCiDetectorSync } from '../../src/detectors/circleCiDetectorSync'
describe('circleCiDetectorSync', () => {
describe('undefined values', () => {
const processValues: any = {}
beforeEach(() => {
// cache values
processValues.CIRCLECI = process.env.CIRCLECI
processValues.CIRCLE_BRANCH = process.env.CIRCLE_BRANCH
processValues.CIRCLE_JOB = process.env.CIRCLE_JOB
processValues.CIRCLE_NODE_INDEX = process.env.CIRCLE_NODE_INDEX
processValues.CIRCLE_BUILD_URL = process.env.CIRCLE_BUILD_URL
processValues.CIRCLE_BUILD_NUM = process.env.CIRCLE_BUILD_NUM
processValues.CIRCLE_SHA1 = process.env.CIRCLE_SHA1
processValues.CIRCLE_PR_NUMBER = process.env.CIRCLE_PR_NUMBER
//reset values
delete process.env.CIRCLECI
delete process.env.CIRCLE_BRANCH
delete process.env.CIRCLE_JOB
delete process.env.CIRCLE_NODE_INDEX
delete process.env.CIRCLE_BUILD_URL
delete process.env.CIRCLE_BUILD_NUM
delete process.env.CIRCLE_SHA1
delete process.env.CIRCLE_PR_NUMBER
})
afterEach(() => {
// Replace values
process.env.CIRCLECI = processValues.CIRCLECI
process.env.CIRCLE_BRANCH = processValues.CIRCLE_BRANCH
process.env.CIRCLE_JOB = processValues.CIRCLE_JOB
process.env.CIRCLE_NODE_INDEX = processValues.CIRCLE_NODE_INDEX
process.env.CIRCLE_BUILD_URL = processValues.CIRCLE_BUILD_URL
process.env.CIRCLE_BUILD_NUM = processValues.CIRCLE_BUILD_NUM
process.env.CIRCLE_SHA1 = processValues.CIRCLE_SHA1
process.env.CIRCLE_PR_NUMBER = processValues.CIRCLE_PR_NUMBER
})
describe('detect', () => {
it('returns an empty resource', () => {
const resource = circleCiDetectorSync.detect()
expect(resource.attributes).to.be.empty
})
})
})
describe('defined values', () => {
const processValues: any = {}
beforeEach(() => {
// cache values
processValues.CIRCLECI = process.env.CIRCLECI
processValues.CIRCLE_BRANCH = process.env.CIRCLE_BRANCH
processValues.CIRCLE_JOB = process.env.CIRCLE_JOB
processValues.CIRCLE_NODE_INDEX = process.env.CIRCLE_NODE_INDEX
processValues.CIRCLE_BUILD_URL = process.env.CIRCLE_BUILD_URL
processValues.CIRCLE_BUILD_NUM = process.env.CIRCLE_BUILD_NUM
processValues.CIRCLE_SHA1 = process.env.CIRCLE_SHA1
processValues.CIRCLE_PR_NUMBER = process.env.CIRCLE_PR_NUMBER
//reset values
process.env.CIRCLECI = 'circleCi'
process.env.CIRCLE_BRANCH = 'circleBranch'
process.env.CIRCLE_JOB = 'circleJob'
process.env.CIRCLE_NODE_INDEX = 'circleNodeIndex'
process.env.CIRCLE_BUILD_URL = 'circleBuildUrl'
process.env.CIRCLE_BUILD_NUM = 'circleBuildNum'
process.env.CIRCLE_SHA1 = 'circleSha1'
process.env.CIRCLE_PR_NUMBER = 'circlePrNumber'
})
afterEach(() => {
// Replace values
process.env.CIRCLECI = processValues.CIRCLECI
process.env.CIRCLE_BRANCH = processValues.CIRCLE_BRANCH
process.env.CIRCLE_JOB = processValues.CIRCLE_JOB
process.env.CIRCLE_NODE_INDEX = processValues.CIRCLE_NODE_INDEX
process.env.CIRCLE_BUILD_URL = processValues.CIRCLE_BUILD_URL
process.env.CIRCLE_BUILD_NUM = processValues.CIRCLE_BUILD_NUM
process.env.CIRCLE_SHA1 = processValues.CIRCLE_SHA1
process.env.CIRCLE_PR_NUMBER = processValues.CIRCLE_PR_NUMBER
})
describe('detect', () => {
it('returns a resource with attributes', () => {
const resource = circleCiDetectorSync.detect()
console.log(resource.attributes)
expect(resource.attributes['ci.circle']).to.equal('circleCi')
expect(resource.attributes['ci.branch']).to.equal('circleBranch')
expect(resource.attributes['ci.job']).to.equal('circleJob')
expect(resource.attributes['ci.node']).to.equal('circleNodeIndex')
expect(resource.attributes['ci.build-url']).to.equal('circleBuildUrl')
expect(resource.attributes['ci.build-number']).to.equal('circleBuildNum')
expect(resource.attributes['SHA1']).to.equal('circleSha1')
expect(resource.attributes['ci.pr-number']).to.equal('circlePrNumber')
})
})
})
})

View File

@@ -201,6 +201,8 @@ const buildEntryPointAndCleanup = async (buildAppDir) => {
path.join(buildAppDir, '**', 'nexus', 'dist-esm'),
path.join(buildAppDir, '**', '@graphql-tools', '**', '*.mjs'),
path.join(buildAppDir, '**', 'graphql', '**', '*.mjs'),
path.join(buildAppDir, '**', '@openTelemetry', '**', 'esm'),
path.join(buildAppDir, '**', '@openTelemetry', '**', 'esnext'),
// We currently do not use any map files
path.join(buildAppDir, '**', '*js.map'),
// License files need to be kept

965
yarn.lock

File diff suppressed because it is too large Load Diff