8000 DialogContainer.telemetryclient (#1523) · nickg33/botbuilder-python@9f121b7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9f121b7

Browse files
DialogContainer.telemetryclient (microsoft#1523)
* DialogContainer.telemetryclient * Black formatting and self on DialogContainer * Adding tests. Testing for method add() are pending due to update breaking fragile tests. * Pylint fix Co-authored-by: Axel Suarez <axsuarez@microsoft.com>
1 parent 9bf779e commit 9f121b7

File tree

3 files changed

+145
-4
lines changed

3 files changed

+145
-4
lines changed

libraries/botbuilder-dialogs/botbuilder/dialogs/dialog_container.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from abc import ABC, abstractmethod
55

66

7+
from botbuilder.core import NullTelemetryClient, BotTelemetryClient
78
from .dialog import Dialog
89
from .dialog_context import DialogContext
910
from .dialog_event import DialogEvent
@@ -17,6 +18,31 @@ def __init__(self, dialog_id: str = None):
1718

1819
self.dialogs = DialogSet()
1920

21+
@property
22+
def telemetry_client(self) -> BotTelemetryClient:
23+
"""
24+
Gets the telemetry client for logging events.
25+
"""
26+
return self._telemetry_client
27+
28+
@telemetry_client.setter
29+
def telemetry_client(self, value: BotTelemetryClient) -> None:
30+
"""
31+
Sets the telemetry client for all dialogs in this set.
32+
"""
33+
if value is None:
34+
self._telemetry_client = NullTelemetryClient()
35+
else:
36+
self._telemetry_client = value
37+
38+
# Care! Dialogs.TelemetryClient assignment internally assigns the
39+
# TelemetryClient for each dialog which could lead to an eventual stack
40+
# overflow in cyclical dialog structures.
41+
# Don't set the telemetry client if the candidate instance is the same as
42+
# the currently set one.
43+
if self.dialogs.telemetry_client != value:
44+
self.dialogs.telemetry_client = self._telemetry_client
45+
2046
@abstractmethod
2147
def create_child_context(self, dialog_context: DialogContext) -> DialogContext:
2248
raise NotImplementedError()

libraries/botbuilder-dialogs/botbuilder/dialogs/dialog_set.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
from hashlib import sha256
55
from typing import Dict
66

7-
from botbuilder.core import TurnContext, BotAssert, StatePropertyAccessor
7+
from botbuilder.core import (
8+
NullTelemetryClient,
9+
BotTelemetryClient,
10+
TurnContext,
11+
BotAssert,
12+
StatePropertyAccessor,
13+
)
814
from .dialog import Dialog
915
from .dialog_state import DialogState
1016

@@ -34,11 +40,31 @@ def __init__(self, dialog_state: StatePropertyAccessor = None):
3440
del frame
3541

3642
self._dialog_state = dialog_state
37-
# self.__telemetry_client = NullBotTelemetryClient.Instance;
43+
self.__telemetry_client = NullTelemetryClient()
3844

3945
self._dialogs: Dict[str, Dialog] = {}
4046
self._version: str = None
4147

48+
@property
49+
def telemetry_client(self) -> BotTelemetryClient:
50+
"""
51+
Gets the telemetry client for logging events.
52+
"""
53+
return self.__telemetry_client
54+
55+
@telemetry_client.setter
56+
def telemetry_client(self, value: BotTelemetryClient) -> None:
57+
"""
58+
Sets the telemetry client for all dialogs in this set.
59+
"""
60+
if value is None:
61+
self.__telemetry_client = NullTelemetryClient()
62+
else:
63+
self.__telemetry_client = value
64+
65+
for dialog in self._dialogs.values():
66+
dialog.telemetry_client = self.__telemetry_client
67+
4268
def get_version(self) -> str:
4369
"""
4470
Gets a unique string which represents the combined versions of all dialogs in 6D40 this this dialogset.

libraries/botbuilder-dialogs/tests/test_dialog_set.py

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@
22
# Licensed under the MIT License.
33

44
import aiounittest
5-
from botbuilder.dialogs import DialogSet, ComponentDialog
6-
from botbuilder.core import ConversationState, MemoryStorage
5+
from botbuilder.dialogs import DialogSet, ComponentDialog, WaterfallDialog
6+
from botbuilder.core import ConversationState, MemoryStorage, NullTelemetryClient
7+
8+
9+
class MyBotTelemetryClient(NullTelemetryClient):
10+
# pylint: disable=useless-return
11+
def __init__(self):
12+
super().__init__()
13+
return
714

815

916
class DialogSetTests(aiounittest.AsyncTestCase):
@@ -18,3 +25,85 @@ def test_dialogset_constructor_null_property(self):
1825

1926
def test_dialogset_constructor_null_from_componentdialog(self):
2027
ComponentDialog("MyId")
28+
29+
def test_dialogset_telemetryset(self):
30+
convo_state = ConversationState(MemoryStorage())
31+
dialog_state_property = convo_state.create_property("dialogstate")
32+
dialog_set = DialogSet(dialog_state_property)
33+
34+
dialog_set.add(WaterfallDialog("A"))
35+
dialog_set.add(WaterfallDialog("B"))
36+
37+
self.assertTrue(
38+
isinstance(
39+
dialog_set.find_dialog("A").telemetry_client, NullTelemetryClient
40+
)
41+
)
42+
self.assertTrue(
43+
isinstance(
44+
dialog_set.find_dialog("B").telemetry_client, NullTelemetryClient
45+
)
46+
)
47+
48+
dialog_set.telemetry_client = MyBotTelemetryClient()
49+
50+
self.assertTrue(
51+
isinstance(
52+
dialog_set.find_dialog("A").telemetry_client, MyBotTelemetryClient
53+
)
54+
)
55+
self.assertTrue(
56+
isinstance(
57+
dialog_set.find_dialog("B").telemetry_client, MyBotTelemetryClient
58+
)
59+
)
60+
61+
def test_dialogset_nulltelemetryset(self):
62+
convo_state = ConversationState(MemoryStorage())
63+
dialog_state_property = convo_state.create_property("dialogstate")
64+
dialog_set = DialogSet(dialog_state_property)
65+
66+
dialog_set.add(WaterfallDialog("A"))
67+
dialog_set.add(WaterfallDialog("B"))
68+
69+
dialog_set.telemetry_client = MyBotTelemetryClient()
70+
dialog_set.telemetry_client = None
71+
72+
self.assertFalse(
73+
isinstance(
74+
dialog_set.find_dialog("A").telemetry_client, MyBotTelemetryClient
75+
)
76+
)
77+
self.assertFalse(
78+
isinstance(
79+
dialog_set.find_dialog("B").telemetry_client, MyBotTelemetryClient
80+
)
81+
)
82+
self.assertTrue(
83+
isinstance(
84+
dialog_set.find_dialog("A").telemetry_client, NullTelemetryClient
85+
)
86+
)
87+
self.assertTrue(
88+
isinstance(
89+
dialog_set.find_dialog("B").telemetry_client, NullTelemetryClient
90+
)
91+
)
92+
93+
# pylint: disable=pointless-string-statement
94+
"""
95+
This test will be enabled when telematry tests are fixed for DialogSet telemetry
96+
def test_dialogset_addtelemetryset(self):
97+
convo_state = ConversationState(MemoryStorage())
98+
dialog_state_property = convo_state.create_property("dialogstate")
99+
dialog_set = DialogSet(dialog_state_property)
100+
101+
dialog_set.add(WaterfallDialog("A"))
102+
dialog_set.add(WaterfallDialog("B"))
103+
104+
dialog_set.telemetry_client = MyBotTelemetryClient()
105+
106+
dialog_set.add(WaterfallDialog("C"))
107+
108+
self.assertTrue(isinstance(dialog_set.find_dialog("C").telemetry_client, MyBotTelemetryClient))
109+
"""

0 commit comments

Comments
 (0)
0