Skip to content

Commit b62faac

Browse files
committed
Remove previous node.js labels approach
We are replacing the manually propagated hashmap-based approach with an approach based on stuffing the labels in v8's ContinuationPreservedEmbedderData (see upcoming commit).
1 parent d8cb5a0 commit b62faac

15 files changed

Lines changed: 15 additions & 1008 deletions

interpreter/customlabels/customlabels.go

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,14 @@ import (
1616
const (
1717
abiVersionExport = "custom_labels_abi_version"
1818
currentSetTlsExport = "custom_labels_current_set"
19-
currentHmTlsExport = "custom_labels_async_hashmap"
2019
)
2120

2221
var dsoRegex = regexp.MustCompile(`.*/libcustomlabels.*\.so`)
23-
var nodeRegex = regexp.MustCompile(`.*/customlabels\.node`)
2422

2523
type data struct {
2624
abiVersionElfVA libpf.Address
2725
currentSetTlsAddr libpf.Address
2826

29-
hasCurrentHm bool
30-
currentHmTlsAddr libpf.Address
31-
3227
isSharedLibrary bool
3328
}
3429

@@ -58,12 +53,9 @@ func Loader(_ interpreter.EbpfHandler, info *interpreter.LoaderInfo) (interprete
5853
// symbol.
5954
fn := info.FileName()
6055
isNativeSharedLibrary := dsoRegex.MatchString(fn)
61-
isNodeExtension := (!isNativeSharedLibrary) && nodeRegex.MatchString(fn)
62-
isSharedLibrary := isNativeSharedLibrary || isNodeExtension
6356

64-
var currentSetTlsAddr, currentHmTlsAddr libpf.Address
65-
var hasCurrentHm bool
66-
if isSharedLibrary {
57+
var currentSetTlsAddr libpf.Address
58+
if isNativeSharedLibrary {
6759
// Resolve thread info TLS export.
6860
tlsDescs, err := ef.TLSDescriptors()
6961
if err != nil {
@@ -74,9 +66,6 @@ func Loader(_ interpreter.EbpfHandler, info *interpreter.LoaderInfo) (interprete
7466
if !ok {
7567
return nil, errors.New("failed to locate TLS descriptor for custom labels")
7668
}
77-
if isNodeExtension {
78-
currentHmTlsAddr, hasCurrentHm = tlsDescs[currentHmTlsExport]
79-
}
8069
} else {
8170
offset, err := ef.LookupTLSSymbolOffset(currentSetTlsExport)
8271
if err != nil {
@@ -88,9 +77,7 @@ func Loader(_ interpreter.EbpfHandler, info *interpreter.LoaderInfo) (interprete
8877
d := data{
8978
abiVersionElfVA: libpf.Address(abiVersionSym.Address),
9079
currentSetTlsAddr: currentSetTlsAddr,
91-
hasCurrentHm: hasCurrentHm,
92-
currentHmTlsAddr: currentHmTlsAddr,
93-
isSharedLibrary: isSharedLibrary,
80+
isSharedLibrary: isNativeSharedLibrary,
9481
}
9582
return &d, nil
9683
}
@@ -120,15 +107,8 @@ func (d data) Attach(ebpf interpreter.EbpfHandler, pid libpf.PID,
120107
currentSetTlsOffset = uint64(d.currentSetTlsAddr)
121108
}
122109

123-
var currentHmTlsOffset uint64
124-
if d.hasCurrentHm {
125-
currentHmTlsOffset = rm.Uint64(bias + d.currentHmTlsAddr + 8)
126-
}
127-
128110
procInfo := support.NativeCustomLabelsProcInfo{
129-
Current_set_tls_offset: currentSetTlsOffset,
130-
Has_current_hm: d.hasCurrentHm,
131-
Current_hm_tls_offset: currentHmTlsOffset,
111+
Set_tls_offset: currentSetTlsOffset,
132112
}
133113
if err := ebpf.UpdateProcData(libpf.CustomLabels, pid, unsafe.Pointer(&procInfo)); err != nil {
134114
return nil, err

interpreter/nodev8/node_offsets_generated.go

Lines changed: 0 additions & 118 deletions
This file was deleted.

interpreter/nodev8/v8.go

Lines changed: 3 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
//go:generate go run ../../tools/csv2go.go ../../tools/complete_offsets.csv node_offsets_generated.go
2-
31
// Copyright The OpenTelemetry Authors
42
// SPDX-License-Identifier: Apache-2.0
53

@@ -156,7 +154,6 @@ package nodev8 // import "go.opentelemetry.io/ebpf-profiler/interpreter/nodev8"
156154

157155
import (
158156
"bytes"
159-
"encoding/binary"
160157
"errors"
161158
"fmt"
162159
"io"
@@ -475,13 +472,6 @@ type v8Data struct {
475472
// version contains the V8 version
476473
version uint32
477474

478-
// Node.js environment offsets
479-
contextHandleOffset uint32
480-
nativeContextOffset uint32
481-
embedderDataOffset uint32
482-
environmentPointerOffset uint32
483-
executionAsyncIdOffset uint32
484-
485475
// bytecodeSizes contains the V8 bytecode length data
486476
bytecodeSizes []byte
487477

@@ -490,9 +480,6 @@ type v8Data struct {
490480

491481
// frametypeToName caches frametype's name
492482
frametypeToName [MaxFrameType]libpf.String
493-
494-
// isolateSym is the symbol of the v8 thread-local current isolate
495-
isolateSym libpf.Address
496483
}
497484

498485
type v8Instance struct {
@@ -1774,12 +1761,6 @@ func (d *v8Data) Attach(ebpf interpreter.EbpfHandler, pid libpf.PID, _ libpf.Add
17741761
data := support.V8ProcInfo{
17751762
Version: d.version,
17761763

1777-
Context_handle_offset: d.contextHandleOffset,
1778-
Native_context_offset: d.nativeContextOffset,
1779-
Embedder_data_offset: d.embedderDataOffset,
1780-
Environment_pointer_offset: d.environmentPointerOffset,
1781-
Execution_async_id_offset: d.executionAsyncIdOffset,
1782-
17831764
Fp_marker: mapFramePointerOffset(vms.FramePointer.Context),
17841765
Fp_function: mapFramePointerOffset(vms.FramePointer.Function),
17851766
Fp_bytecode_offset: mapFramePointerOffset(vms.FramePointer.BytecodeOffset),
@@ -1798,10 +1779,9 @@ func (d *v8Data) Attach(ebpf interpreter.EbpfHandler, pid libpf.PID, _ libpf.Add
17981779
Off_Code_instruction_size: uint8(vms.Code.InstructionSize),
17991780
Off_Code_flags: uint8(vms.Code.Flags),
18001781

1801-
Codekind_shift: vms.CodeKind.FieldShift,
1802-
Codekind_mask: uint8(vms.CodeKind.FieldMask),
1803-
Codekind_baseline: vms.CodeKind.Baseline,
1804-
Isolate_sym: uint64(d.isolateSym),
1782+
Codekind_shift: vms.CodeKind.FieldShift,
1783+
Codekind_mask: uint8(vms.CodeKind.FieldMask),
1784+
Codekind_baseline: vms.CodeKind.Baseline,
18051785
}
18061786
if err := ebpf.UpdateProcData(libpf.V8, pid, unsafe.Pointer(&data)); err != nil {
18071787
return nil, err
@@ -2099,56 +2079,6 @@ func (d *v8Data) readIntrospectionData(ef *pfelf.File) error {
20992079
return nil
21002080
}
21012081

2102-
// loadNodeClData loads various offsets that are needed for custom labels handling.
2103-
func (d *v8Data) loadNodeClData(ef *pfelf.File) error {
2104-
offset, err := ef.LookupTLSSymbolOffset("_ZN2v88internal18g_current_isolate_E")
2105-
if err != nil {
2106-
return err
2107-
}
2108-
d.isolateSym = libpf.Address(offset)
2109-
2110-
syms, err := ef.ReadSymbols()
2111-
if err != nil {
2112-
return fmt.Errorf("failed to read symbols: %w", err)
2113-
}
2114-
2115-
sym, err := syms.LookupSymbol("_ZZ21napi_get_node_versionE7version")
2116-
if err != nil {
2117-
return fmt.Errorf("failed to lookup Node version symbol: %w", err)
2118-
}
2119-
2120-
if sym == nil {
2121-
return errors.New("Node version symbol not found")
2122-
}
2123-
2124-
if sym.Size < 12 {
2125-
return fmt.Errorf("Node version symbol size too small: %d", sym.Size)
2126-
}
2127-
2128-
versBuf := make([]byte, 12)
2129-
if _, err = ef.ReadVirtualMemory(versBuf, int64(sym.Address)); err != nil {
2130-
return fmt.Errorf("failed to read Node version data: %w", err)
2131-
}
2132-
2133-
major := binary.LittleEndian.Uint32(versBuf[0:4])
2134-
minor := binary.LittleEndian.Uint32(versBuf[4:8])
2135-
patch := binary.LittleEndian.Uint32(versBuf[8:12])
2136-
2137-
// Construct version string and look up Node.js environment offsets
2138-
nodeVersion := fmt.Sprintf("v%d.%d.%d", major, minor, patch)
2139-
if offsets, found := nodeOffsetTable[nodeVersion]; found {
2140-
d.contextHandleOffset = offsets.contextHandle
2141-
d.nativeContextOffset = offsets.nativeContext
2142-
d.embedderDataOffset = offsets.embedderData
2143-
d.environmentPointerOffset = offsets.environmentPointer
2144-
d.executionAsyncIdOffset = offsets.executionAsyncId
2145-
} else {
2146-
return fmt.Errorf("no offsets found for Node.js version %s", nodeVersion)
2147-
}
2148-
2149-
return nil
2150-
}
2151-
21522082
func Loader(ebpf interpreter.EbpfHandler, info *interpreter.LoaderInfo) (interpreter.Data, error) {
21532083
if !v8Regex.MatchString(info.FileName()) {
21542084
return nil, nil
@@ -2217,10 +2147,6 @@ func Loader(ebpf interpreter.EbpfHandler, info *interpreter.LoaderInfo) (interpr
22172147
}
22182148
}
22192149

2220-
if err = d.loadNodeClData(ef); err != nil {
2221-
log.Warnf("Failed to load extra data for Node.js custom labels handling: %v", err)
2222-
}
2223-
22242150
// load introspection data
22252151
if err = d.readIntrospectionData(ef); err != nil {
22262152
return nil, err

metrics/ids.go

Lines changed: 2 additions & 53 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)