Skip to content

Commit 73e69e5

Browse files
authored
Merge branch 'main' into lzchen-patch-10
2 parents 5350d55 + 6fdaf44 commit 73e69e5

File tree

9 files changed

+105
-81
lines changed

9 files changed

+105
-81
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash -e
2+
3+
sed -i "/\[stable\]/{n;s/version=.*/version=$1/}" eachdist.ini
4+
sed -i "/\[prerelease\]/{n;s/version=.*/version=$2/}" eachdist.ini
5+
6+
./scripts/eachdist.py update_patch_versions \
7+
--stable_version=$1 \
8+
--unstable_version=$2 \
9+
--stable_version_prev=$3 \
10+
--unstable_version_prev=$4
11+

.github/workflows/prepare-patch-release.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,18 @@ jobs:
4343
exit 1
4444
fi
4545
46+
stable_version_prev="$stable_major_minor.$((stable_patch))"
47+
unstable_version_prev="0.${unstable_minor}b$((unstable_patch))"
4648
stable_version="$stable_major_minor.$((stable_patch + 1))"
4749
unstable_version="0.${unstable_minor}b$((unstable_patch + 1))"
4850
4951
echo "STABLE_VERSION=$stable_version" >> $GITHUB_ENV
5052
echo "UNSTABLE_VERSION=$unstable_version" >> $GITHUB_ENV
53+
echo "STABLE_VERSION_PREV=$stable_version_prev" >> $GITHUB_ENV
54+
echo "UNSTABLE_VERSION_PREV=$unstable_version_prev" >> $GITHUB_ENV
5155
5256
- name: Update version
53-
run: .github/scripts/update-version.sh $STABLE_VERSION $UNSTABLE_VERSION
57+
run: .github/scripts/update-version-patch.sh $STABLE_VERSION $UNSTABLE_VERSION $STABLE_VERSION_PREV $UNSTABLE_VERSION_PREV
5458

5559
- name: Update the change log with the approximate release date
5660
run: |

.github/workflows/release.yml

Lines changed: 0 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -129,80 +129,3 @@ jobs:
129129
--notes-file /tmp/release-notes.txt \
130130
--discussion-category announcements \
131131
v$STABLE_VERSION
132-
133-
- uses: actions/checkout@v4
134-
with:
135-
# the step below is creating a pull request against main
136-
ref: main
137-
138-
- name: Copy change log updates to main
139-
env:
140-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
141-
run: |
142-
if [[ -z $PRIOR_VERSION_WHEN_PATCH ]]; then
143-
# this was not a patch release, so the version exists already in the CHANGELOG.md
144-
145-
# update the release date
146-
date=$(gh release view v$STABLE_VERSION --json publishedAt --jq .publishedAt | sed 's/T.*//')
147-
sed -Ei "s/## Version ${STABLE_VERSION}\/${UNSTABLE_VERSION} .*/## Version ${STABLE_VERSION}\/${UNSTABLE_VERSION} ($date)/" CHANGELOG.md
148-
149-
# the entries are copied over from the release branch to support workflows
150-
# where change log entries may be updated after preparing the release branch
151-
152-
# copy the portion above the release, up to and including the heading
153-
sed -n "0,/^## Version ${STABLE_VERSION}\/${UNSTABLE_VERSION} ($date)/p" CHANGELOG.md > /tmp/CHANGELOG.md
154-
155-
# copy the release notes
156-
cat /tmp/CHANGELOG_SECTION.md >> /tmp/CHANGELOG.md
157-
158-
# copy the portion below the release
159-
sed -n "0,/^## Version ${STABLE_VERSION}\/${UNSTABLE_VERSION} /d;0,/^## Version /{/^## Version/!d};p" CHANGELOG.md \
160-
>> /tmp/CHANGELOG.md
161-
162-
# update the real CHANGELOG.md
163-
cp /tmp/CHANGELOG.md CHANGELOG.md
164-
else
165-
# this was a patch release, so the version does not exist already in the CHANGELOG.md
166-
167-
# copy the portion above the top-most release, not including the heading
168-
sed -n "0,/^## Version /{ /^## Version /!p }" CHANGELOG.md > /tmp/CHANGELOG.md
169-
170-
# add the heading
171-
date=$(gh release view v$STABLE_VERSION --json publishedAt --jq .publishedAt | sed 's/T.*//')
172-
echo "## Version ${STABLE_VERSION}/${UNSTABLE_VERSION} ($date)" >> /tmp/CHANGELOG.md
173-
174-
# copy the release notes
175-
cat /tmp/CHANGELOG_SECTION.md >> /tmp/CHANGELOG.md
176-
177-
# copy the portion starting from the top-most release
178-
sed -n "/^## Version /,\$p" CHANGELOG.md >> /tmp/CHANGELOG.md
179-
180-
# update the real CHANGELOG.md
181-
cp /tmp/CHANGELOG.md CHANGELOG.md
182-
fi
183-
184-
- name: Use CLA approved github bot
185-
run: .github/scripts/use-cla-approved-github-bot.sh
186-
187-
- name: Create pull request against main
188-
env:
189-
# not using secrets.GITHUB_TOKEN since pull requests from that token do not run workflows
190-
GITHUB_TOKEN: ${{ secrets.OPENTELEMETRYBOT_GITHUB_TOKEN }}
191-
run: |
192-
message="Copy change log updates from $GITHUB_REF_NAME"
193-
body="Copy log updates from \`$GITHUB_REF_NAME\`."
194-
branch="opentelemetrybot/copy-change-log-updates-from-${GITHUB_REF_NAME//\//-}"
195-
196-
if [[ -z $PRIOR_VERSION_WHEN_PATCH ]]; then
197-
if git diff --quiet; then
198-
echo there are no updates needed to the change log on main, not creating pull request
199-
exit 0 # success
200-
fi
201-
fi
202-
203-
git commit -a -m "$message"
204-
git push origin HEAD:$branch
205-
gh pr create --title "$message" \
206-
--body "$body" \
207-
--head $branch \
208-
--base main

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- Fix crash exporting a log record with None body
11+
([#4276](https://github.com/open-telemetry/opentelemetry-python/pull/4276))
1012
- Fix metrics export with exemplar and no context and filtering observable instruments
1113
([#4251](https://github.com/open-telemetry/opentelemetry-python/pull/4251))
1214
- Fix recursion error with sdk disabled and handler added to root logger
1315
([#4259](https://github.com/open-telemetry/opentelemetry-python/pull/4259))
1416
- sdk: setup EventLogger when OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED is set
1517
([#4270](https://github.com/open-telemetry/opentelemetry-python/pull/4270))
18+
- api: fix logging of duplicate EventLogger setup warning
19+
([#4299](https://github.com/open-telemetry/opentelemetry-python/pull/4299))
1620

1721
## Version 1.28.0/0.49b0 (2024-11-05)
1822

exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@ def _encode_log(log_data: LogData) -> PB2LogRecord:
4848
if log_data.log_record.trace_id == 0
4949
else _encode_trace_id(log_data.log_record.trace_id)
5050
)
51+
body = log_data.log_record.body
5152
return PB2LogRecord(
5253
time_unix_nano=log_data.log_record.timestamp,
5354
observed_time_unix_nano=log_data.log_record.observed_timestamp,
5455
span_id=span_id,
5556
trace_id=trace_id,
5657
flags=int(log_data.log_record.trace_flags),
57-
body=_encode_value(log_data.log_record.body),
58+
body=_encode_value(body) if body is not None else None,
5859
severity_text=log_data.log_record.severity_text,
5960
attributes=_encode_attributes(log_data.log_record.attributes),
6061
dropped_attributes_count=log_data.log_record.dropped_attributes,

exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ def test_encode(self):
5151
sdk_logs, expected_encoding = self.get_test_logs()
5252
self.assertEqual(encode_logs(sdk_logs), expected_encoding)
5353

54+
def test_encode_no_body(self):
55+
sdk_logs, expected_encoding = self.get_test_logs()
56+
for log in sdk_logs:
57+
log.log_record.body = None
58+
59+
for resource_log in expected_encoding.resource_logs:
60+
for scope_log in resource_log.scope_logs:
61+
for log_record in scope_log.log_records:
62+
log_record.ClearField("body")
63+
64+
self.assertEqual(encode_logs(sdk_logs), expected_encoding)
65+
5466
def test_dropped_attributes_count(self):
5567
sdk_logs = self._get_test_logs_dropped_attributes()
5668
encoded_logs = encode_logs(sdk_logs)

opentelemetry-api/src/opentelemetry/_events/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def set_elp() -> None:
192192

193193
did_set = _EVENT_LOGGER_PROVIDER_SET_ONCE.do_once(set_elp)
194194

195-
if log and did_set:
195+
if log and not did_set:
196196
_logger.warning(
197197
"Overriding of current EventLoggerProvider is not allowed"
198198
)

opentelemetry-api/tests/events/test_event_logger_provider.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,28 @@
1111

1212

1313
class TestGlobals(EventsGlobalsTest, unittest.TestCase):
14-
def test_set_event_logger_provider(self):
14+
@patch("opentelemetry._events._logger")
15+
def test_set_event_logger_provider(self, logger_mock):
1516
elp_mock = Mock()
1617
# pylint: disable=protected-access
1718
self.assertIsNone(events._EVENT_LOGGER_PROVIDER)
1819
set_event_logger_provider(elp_mock)
1920
self.assertIs(events._EVENT_LOGGER_PROVIDER, elp_mock)
2021
self.assertIs(get_event_logger_provider(), elp_mock)
22+
logger_mock.warning.assert_not_called()
23+
24+
# pylint: disable=no-self-use
25+
@patch("opentelemetry._events._logger")
26+
def test_set_event_logger_provider_will_warn_second_call(
27+
self, logger_mock
28+
):
29+
elp_mock = Mock()
30+
set_event_logger_provider(elp_mock)
31+
set_event_logger_provider(elp_mock)
32+
33+
logger_mock.warning.assert_called_once_with(
34+
"Overriding of current EventLoggerProvider is not allowed"
35+
)
2136

2237
def test_get_event_logger_provider(self):
2338
# pylint: disable=protected-access

scripts/eachdist.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,16 @@ def setup_instparser(instparser):
236236
"releaseargs", nargs=argparse.REMAINDER, help=extraargs_help("pytest")
237237
)
238238

239+
patchreleaseparser = subparsers.add_parser(
240+
"update_patch_versions",
241+
help="Updates version numbers during patch release, used by maintainers and CI",
242+
)
243+
patchreleaseparser.set_defaults(func=patch_release_args)
244+
patchreleaseparser.add_argument("--stable_version", required=True)
245+
patchreleaseparser.add_argument("--unstable_version", required=True)
246+
patchreleaseparser.add_argument("--stable_version_prev", required=True)
247+
patchreleaseparser.add_argument("--unstable_version_prev", required=True)
248+
239249
fmtparser = subparsers.add_parser(
240250
"format",
241251
help="Formats all source code with black and isort.",
@@ -599,6 +609,24 @@ def update_dependencies(targets, version, packages):
599609
)
600610

601611

612+
def update_patch_dependencies(targets, version, prev_version, packages):
613+
print("updating patch dependencies")
614+
# PEP 508 allowed specifier operators
615+
operators = ["==", "!=", "<=", ">=", "<", ">", "===", "~=", "="]
616+
operators_pattern = "|".join(re.escape(op) for op in operators)
617+
618+
for pkg in packages:
619+
search = rf"({basename(pkg)}[^,]*?)(\s?({operators_pattern})\s?)(.*{prev_version})"
620+
replace = r"\g<1>\g<2>" + version
621+
print(f"{search=}\t{replace=}\t{pkg=}")
622+
update_files(
623+
targets,
624+
"pyproject.toml",
625+
search,
626+
replace,
627+
)
628+
629+
602630
def update_files(targets, filename, search, replace):
603631
errors = False
604632
for target in targets:
@@ -640,6 +668,32 @@ def release_args(args):
640668
update_version_files(targets, version, packages)
641669

642670

671+
def patch_release_args(args):
672+
print("preparing patch release")
673+
674+
rootpath = find_projectroot()
675+
targets = list(find_targets_unordered(rootpath))
676+
cfg = ConfigParser()
677+
cfg.read(str(find_projectroot() / "eachdist.ini"))
678+
# stable
679+
mcfg = cfg["stable"]
680+
packages = mcfg["packages"].split()
681+
print(f"update stable packages to {args.stable_version}")
682+
update_patch_dependencies(
683+
targets, args.stable_version, args.stable_version_prev, packages
684+
)
685+
update_version_files(targets, args.stable_version, packages)
686+
687+
# prerelease
688+
mcfg = cfg["prerelease"]
689+
packages = mcfg["packages"].split()
690+
print(f"update prerelease packages to {args.unstable_version}")
691+
update_patch_dependencies(
692+
targets, args.unstable_version, args.unstable_version_prev, packages
693+
)
694+
update_version_files(targets, args.unstable_version, packages)
695+
696+
643697
def test_args(args):
644698
clean_remainder_args(args.pytestargs)
645699
execute_args(

0 commit comments

Comments
 (0)