@@ -20,6 +20,7 @@ import {
2020import type { Event , Scope } from '@sentry/types' ;
2121import { makeTraceState } from '../src/propagator' ;
2222
23+ import { SemanticAttributes } from '@opentelemetry/semantic-conventions' ;
2324import { continueTrace , startInactiveSpan , startSpan , startSpanManual } from '../src/trace' ;
2425import type { AbstractSpan } from '../src/types' ;
2526import { getDynamicSamplingContextFromSpan } from '../src/utils/dynamicSamplingContext' ;
@@ -1358,6 +1359,76 @@ describe('trace (sampling)', () => {
13581359 } ) ;
13591360} ) ;
13601361
1362+ describe ( 'HTTP methods (sampling)' , ( ) => {
1363+ beforeEach ( ( ) => {
1364+ mockSdkInit ( { enableTracing : true } ) ;
1365+ } ) ;
1366+
1367+ afterEach ( ( ) => {
1368+ cleanupOtel ( ) ;
1369+ } ) ;
1370+
1371+ it ( 'does sample when HTTP method is other than OPTIONS or HEAD' , ( ) => {
1372+ const spanGET = startSpanManual (
1373+ { name : 'test span' , attributes : { [ SemanticAttributes . HTTP_METHOD ] : 'GET' } } ,
1374+ span => {
1375+ return span ;
1376+ } ,
1377+ ) ;
1378+ expect ( spanIsSampled ( spanGET ) ) . toBe ( true ) ;
1379+ expect ( getSamplingDecision ( spanGET . spanContext ( ) ) ) . toBe ( true ) ;
1380+
1381+ const spanPOST = startSpanManual (
1382+ { name : 'test span' , attributes : { [ SemanticAttributes . HTTP_METHOD ] : 'POST' } } ,
1383+ span => {
1384+ return span ;
1385+ } ,
1386+ ) ;
1387+ expect ( spanIsSampled ( spanPOST ) ) . toBe ( true ) ;
1388+ expect ( getSamplingDecision ( spanPOST . spanContext ( ) ) ) . toBe ( true ) ;
1389+
1390+ const spanPUT = startSpanManual (
1391+ { name : 'test span' , attributes : { [ SemanticAttributes . HTTP_METHOD ] : 'PUT' } } ,
1392+ span => {
1393+ return span ;
1394+ } ,
1395+ ) ;
1396+ expect ( spanIsSampled ( spanPUT ) ) . toBe ( true ) ;
1397+ expect ( getSamplingDecision ( spanPUT . spanContext ( ) ) ) . toBe ( true ) ;
1398+
1399+ const spanDELETE = startSpanManual (
1400+ { name : 'test span' , attributes : { [ SemanticAttributes . HTTP_METHOD ] : 'DELETE' } } ,
1401+ span => {
1402+ return span ;
1403+ } ,
1404+ ) ;
1405+ expect ( spanIsSampled ( spanDELETE ) ) . toBe ( true ) ;
1406+ expect ( getSamplingDecision ( spanDELETE . spanContext ( ) ) ) . toBe ( true ) ;
1407+ } ) ;
1408+
1409+ it ( 'does not sample when HTTP method is OPTIONS' , ( ) => {
1410+ const span = startSpanManual (
1411+ { name : 'test span' , attributes : { [ SemanticAttributes . HTTP_METHOD ] : 'OPTIONS' } } ,
1412+ span => {
1413+ return span ;
1414+ } ,
1415+ ) ;
1416+ expect ( spanIsSampled ( span ) ) . toBe ( false ) ;
1417+ expect ( getSamplingDecision ( span . spanContext ( ) ) ) . toBe ( false ) ;
1418+ } ) ;
1419+
1420+ it ( 'does not sample when HTTP method is HEAD' , ( ) => {
1421+ const span = startSpanManual (
1422+ { name : 'test span' , attributes : { [ SemanticAttributes . HTTP_METHOD ] : 'HEAD' } } ,
1423+ span => {
1424+ return span ;
1425+ } ,
1426+ ) ;
1427+ expect ( spanIsSampled ( span ) ) . toBe ( false ) ;
1428+ expect ( getSamplingDecision ( span . spanContext ( ) ) ) . toBe ( false ) ;
1429+ } ) ;
1430+ } ) ;
1431+
13611432describe ( 'continueTrace' , ( ) => {
13621433 beforeEach ( ( ) => {
13631434 mockSdkInit ( { enableTracing : true } ) ;
0 commit comments