-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch
Stream
back to having an AttributeFilter
field and add `Ne…
…w*Filter` functions (#4444) * Add allow/deny attr filters * Revert "Replace `Stream.AttributeFilter` with `AllowAttributeKeys` (#4288)" This reverts commit 1633c74. * Rename new attr filter funcs Do not include the term "Attribute" in a creation function of the "attribute" pkg. * Update the AttributeFilter field documentation * Add tests for filter creation funcs * Add change to changelog * Apply feedback * Use NewDenyKeysFilter for allow-all and deny-list filters * Remove links from field docs These links do not render. --------- Co-authored-by: Chester Cheung <[email protected]>
- Loading branch information
1 parent
f15ae16
commit 69611bd
Showing
10 changed files
with
185 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// | ||
// Licensed 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. | ||
|
||
package attribute // import "go.opentelemetry.io/otel/attribute" | ||
|
||
// Filter supports removing certain attributes from attribute sets. When | ||
// the filter returns true, the attribute will be kept in the filtered | ||
// attribute set. When the filter returns false, the attribute is excluded | ||
// from the filtered attribute set, and the attribute instead appears in | ||
// the removed list of excluded attributes. | ||
type Filter func(KeyValue) bool | ||
|
||
// NewAllowKeysFilter returns a Filter that only allows attributes with one of | ||
// the provided keys. | ||
// | ||
// If keys is empty a deny-all filter is returned. | ||
func NewAllowKeysFilter(keys ...Key) Filter { | ||
if len(keys) <= 0 { | ||
return func(kv KeyValue) bool { return false } | ||
} | ||
|
||
allowed := make(map[Key]struct{}) | ||
for _, k := range keys { | ||
allowed[k] = struct{}{} | ||
} | ||
return func(kv KeyValue) bool { | ||
_, ok := allowed[kv.Key] | ||
return ok | ||
} | ||
} | ||
|
||
// NewDenyKeysFilter returns a Filter that only allows attributes | ||
// that do not have one of the provided keys. | ||
// | ||
// If keys is empty an allow-all filter is returned. | ||
func NewDenyKeysFilter(keys ...Key) Filter { | ||
if len(keys) <= 0 { | ||
return func(kv KeyValue) bool { return true } | ||
} | ||
|
||
forbid := make(map[Key]struct{}) | ||
for _, k := range keys { | ||
forbid[k] = struct{}{} | ||
} | ||
return func(kv KeyValue) bool { | ||
_, ok := forbid[kv.Key] | ||
return !ok | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// | ||
// Licensed 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. | ||
|
||
package attribute | ||
|
||
import "testing" | ||
|
||
func TestNewAllowKeysFilter(t *testing.T) { | ||
keys := []string{"zero", "one", "two"} | ||
attrs := []KeyValue{Int(keys[0], 0), Int(keys[1], 1), Int(keys[2], 2)} | ||
|
||
t.Run("Empty", func(t *testing.T) { | ||
empty := NewAllowKeysFilter() | ||
for _, kv := range attrs { | ||
if empty(kv) { | ||
t.Errorf("empty NewAllowKeysFilter filter accepted %v", kv) | ||
} | ||
} | ||
}) | ||
|
||
t.Run("Partial", func(t *testing.T) { | ||
partial := NewAllowKeysFilter(Key(keys[0]), Key(keys[1])) | ||
for _, kv := range attrs[:2] { | ||
if !partial(kv) { | ||
t.Errorf("partial NewAllowKeysFilter filter denied %v", kv) | ||
} | ||
} | ||
if partial(attrs[2]) { | ||
t.Errorf("partial NewAllowKeysFilter filter accepted %v", attrs[2]) | ||
} | ||
}) | ||
|
||
t.Run("Full", func(t *testing.T) { | ||
full := NewAllowKeysFilter(Key(keys[0]), Key(keys[1]), Key(keys[2])) | ||
for _, kv := range attrs { | ||
if !full(kv) { | ||
t.Errorf("full NewAllowKeysFilter filter denied %v", kv) | ||
} | ||
} | ||
}) | ||
} | ||
|
||
func TestNewDenyKeysFilter(t *testing.T) { | ||
keys := []string{"zero", "one", "two"} | ||
attrs := []KeyValue{Int(keys[0], 0), Int(keys[1], 1), Int(keys[2], 2)} | ||
|
||
t.Run("Empty", func(t *testing.T) { | ||
empty := NewDenyKeysFilter() | ||
for _, kv := range attrs { | ||
if !empty(kv) { | ||
t.Errorf("empty NewDenyKeysFilter filter denied %v", kv) | ||
} | ||
} | ||
}) | ||
|
||
t.Run("Partial", func(t *testing.T) { | ||
partial := NewDenyKeysFilter(Key(keys[0]), Key(keys[1])) | ||
for _, kv := range attrs[:2] { | ||
if partial(kv) { | ||
t.Errorf("partial NewDenyKeysFilter filter accepted %v", kv) | ||
} | ||
} | ||
if !partial(attrs[2]) { | ||
t.Errorf("partial NewDenyKeysFilter filter denied %v", attrs[2]) | ||
} | ||
}) | ||
|
||
t.Run("Full", func(t *testing.T) { | ||
full := NewDenyKeysFilter(Key(keys[0]), Key(keys[1]), Key(keys[2])) | ||
for _, kv := range attrs { | ||
if full(kv) { | ||
t.Errorf("full NewDenyKeysFilter filter accepted %v", kv) | ||
} | ||
} | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters