Merge pull request #6766 from matrix-org/travis/measure-encryption-perf
Add config option to turn on in-room event sending timing metricspull/21833/head
						commit
						bdb29e96fa
					
				|  | @ -39,6 +39,8 @@ import { | |||
| import { IUpload } from "./models/IUpload"; | ||||
| import { IAbortablePromise, IImageInfo } from "matrix-js-sdk/src/@types/partials"; | ||||
| import { BlurhashEncoder } from "./BlurhashEncoder"; | ||||
| import SettingsStore from "./settings/SettingsStore"; | ||||
| import { decorateStartSendingTime, sendRoundTripMetric } from "./sendTimePerformanceMetrics"; | ||||
| 
 | ||||
| const MAX_WIDTH = 800; | ||||
| const MAX_HEIGHT = 600; | ||||
|  | @ -539,6 +541,10 @@ export default class ContentMessages { | |||
|             msgtype: "", // set later
 | ||||
|         }; | ||||
| 
 | ||||
|         if (SettingsStore.getValue("Performance.addSendMessageTimingMetadata")) { | ||||
|             decorateStartSendingTime(content); | ||||
|         } | ||||
| 
 | ||||
|         // if we have a mime type for the file, add it to the message metadata
 | ||||
|         if (file.type) { | ||||
|             content.info.mimetype = file.type; | ||||
|  | @ -614,6 +620,11 @@ export default class ContentMessages { | |||
|         }).then(function() { | ||||
|             if (upload.canceled) throw new UploadCanceledError(); | ||||
|             const prom = matrixClient.sendMessage(roomId, content); | ||||
|             if (SettingsStore.getValue("Performance.addSendMessageTimingMetadata")) { | ||||
|                 prom.then(resp => { | ||||
|                     sendRoundTripMetric(matrixClient, roomId, resp.event_id); | ||||
|                 }); | ||||
|             } | ||||
|             CountlyAnalytics.instance.trackSendMessage(startTime, prom, roomId, false, false, content); | ||||
|             return prom; | ||||
|         }, function(err) { | ||||
|  |  | |||
|  | @ -54,6 +54,7 @@ import { Room } from 'matrix-js-sdk/src/models/room'; | |||
| import ErrorDialog from "../dialogs/ErrorDialog"; | ||||
| import QuestionDialog from "../dialogs/QuestionDialog"; | ||||
| import { ActionPayload } from "../../../dispatcher/payloads"; | ||||
| import { decorateStartSendingTime, sendRoundTripMetric } from "../../../sendTimePerformanceMetrics"; | ||||
| 
 | ||||
| function addReplyToMessageContent( | ||||
|     content: IContent, | ||||
|  | @ -418,6 +419,10 @@ export default class SendMessageComposer extends React.Component<IProps> { | |||
|             // don't bother sending an empty message
 | ||||
|             if (!content.body.trim()) return; | ||||
| 
 | ||||
|             if (SettingsStore.getValue("Performance.addSendMessageTimingMetadata")) { | ||||
|                 decorateStartSendingTime(content); | ||||
|             } | ||||
| 
 | ||||
|             const prom = this.context.sendMessage(roomId, content); | ||||
|             if (replyToEvent) { | ||||
|                 // Clear reply_to_event as we put the message into the queue
 | ||||
|  | @ -433,6 +438,11 @@ export default class SendMessageComposer extends React.Component<IProps> { | |||
|                     dis.dispatch({ action: `effects.${effect.command}` }); | ||||
|                 } | ||||
|             }); | ||||
|             if (SettingsStore.getValue("Performance.addSendMessageTimingMetadata")) { | ||||
|                 prom.then(resp => { | ||||
|                     sendRoundTripMetric(this.context, roomId, resp.event_id); | ||||
|                 }); | ||||
|             } | ||||
|             CountlyAnalytics.instance.trackSendMessage(startTime, prom, roomId, false, !!replyToEvent, content); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,46 @@ | |||
| /* | ||||
| Copyright 2021 The Matrix.org Foundation C.I.C. | ||||
| 
 | ||||
| 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. | ||||
| */ | ||||
| 
 | ||||
| import { MatrixClient } from "matrix-js-sdk/src"; | ||||
| 
 | ||||
| /** | ||||
|  * Decorates the given event content object with the "send start time". The | ||||
|  * object will be modified in-place. | ||||
|  * @param {object} content The event content. | ||||
|  */ | ||||
| export function decorateStartSendingTime(content: object) { | ||||
|     content['io.element.performance_metrics'] = { | ||||
|         sendStartTs: Date.now(), | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Called when an event decorated with `decorateStartSendingTime()` has been sent | ||||
|  * by the server (the client now knows the event ID). | ||||
|  * @param {MatrixClient} client The client to send as. | ||||
|  * @param {string} inRoomId The room ID where the original event was sent. | ||||
|  * @param {string} forEventId The event ID for the decorated event. | ||||
|  */ | ||||
| export function sendRoundTripMetric(client: MatrixClient, inRoomId: string, forEventId: string) { | ||||
|     // noinspection JSIgnoredPromiseFromCall
 | ||||
|     client.sendEvent(inRoomId, 'io.element.performance_metric', { | ||||
|         "io.element.performance_metrics": { | ||||
|             forEventId: forEventId, | ||||
|             responseTs: Date.now(), | ||||
|             kind: 'send_time', | ||||
|         }, | ||||
|     }); | ||||
| } | ||||
|  | @ -759,6 +759,10 @@ export const SETTINGS: {[setting: string]: ISetting} = { | |||
|         default: true, | ||||
|         controller: new ReducedMotionController(), | ||||
|     }, | ||||
|     "Performance.addSendMessageTimingMetadata": { | ||||
|         supportedLevels: [SettingLevel.CONFIG], | ||||
|         default: false, | ||||
|     }, | ||||
|     "Widgets.pinned": { // deprecated
 | ||||
|         supportedLevels: LEVELS_ROOM_OR_ACCOUNT, | ||||
|         default: {}, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Travis Ralston
						Travis Ralston