Faits : A. Z._ AG, dont le siège est à Berne, se consacre aux services dans le domaine des assurances et dans d'autres domaines connexes. Dès le 27 juin 2011, elle a engagé X._ en qualité de responsable du service à la clientèle de son agence de Lausanne. Plusieurs collaborateurs lui étaient subordonnés. Elle avait pour chef V._; celui-ci avait lui-même pour chef W._. B. V._, X._ et les autres cadres subordonnés à W._ étaient soumis à un fort stress. W._ n'acceptait aucun avis contraire au sien et il répondait à ses subordonnés en se montrant arrogant et irrespectueux. Il a notamment réagi de cette manière lors d'une séance de cadres à la fin de l'année 2013. Dans le contexte d'une charge de travail que ses subordonnés tenaient déjà pour excessive, il annonçait des tâches supplémentaires. Il a imposé le silence à X._. Le 23 octobre 2013, W._ était intervenu auprès de V._ pour relever que X._ n'accomplissait pas le nombre d'heures de travail dû à l'employeuse et que cette situation était inadmissible. Il fut formellement rappelé à X._ que les heures dues devaient être accomplies et que la gestion de son temps de travail devait être un exemple pour le personnel subalterne. Le 10 octobre 2014, W._ est derechef intervenu auprès de V._ pour critiquer l'insuffisance des heures de travail accomplies à l'agence de Lausanne. V._ a démissionné de son poste le 13 du même mois, à ses dires en raison de l'attitude irrespectueuse de W._. Le 30, lors d'un entretien avec X._, en présence d'une collaboratrice du service des ressources humaines, W._ lui a reproché une gestion excessivement laxiste de l'équipe placée sous sa responsabilité. Le 3 novembre 2014, W._ a pris part à une séance hebdomadaire à laquelle il n'était habituellement pas présent. Il a averti les collaborateurs qu'il s'apprêtait à « reprendre les choses en main » et qu'il n'était « pas d'accord » avec une mesure d'appui au personnel que X._ avait proposée en 2012, qu'il avait alors approuvée, consistant dans le conseil apporté dans les bureaux par une professeure de yoga. C. Dès le lendemain 4 novembre et jusqu'au 12 décembre 2014, X._ a subi une incapacité de travail totale pour cause de maladie. Elle est retournée à son poste le lundi 15 décembre. Son accès à l'infrastructure informatique était alors bloqué. Produisant un certificat médical, elle a annoncé que l'incapacité de travail se prolongerait au taux de 50 % jusqu'au 9 janvier 2015. W._ lui a alors signifié son licenciement ordinaire avec libération de l'obligation de travailler. Elle a rassemblé ses collaborateurs dans un bureau afin de prendre congé. W._ a abruptement interrompu leur réunion, renvoyant les collaborateurs à leurs postes, et il a surveillé X._ pendant qu'elle récupérait ses affaires personnelles. Le 18 mai 2015, par l'entremise de son conseil, X._ a signifié son opposition au licenciement; elle le tenait pour abusif. En raison d'une nouvelle période d'incapacité de travail, suivie d'une grossesse et d'un accouchement, les rapports contractuels ont pris fin le 30 juin 2016. D. Le 21 octobre 2016, X._ a ouvert action contre Z._ AG devant le Tribunal civil de l'arrondissement de Lausanne. La défenderesse devait être condamnée à payer 42'840 fr. à titre d'indemnité pour licenciement abusif, avec intérêts au taux de 5% par an dès le 19 février 2015. La défenderesse devait être aussi condamnée à remettre un certificat de travail final au libellé correspondant à un certificat intermédiaire précédemment remis. La défenderesse a conclu au rejet de l'action. Le tribunal s'est prononcé le 14 septembre 2018. Accueillant partiellement l'action, il a condamné la défenderesse à payer 21'420 fr. avec intérêts selon les conclusions de la demande. Il a également condamné la défenderesse à remettre un certificat de travail dont le jugement fixe le libellé. La Cour d'appel civile du Tribunal cantonal a statué le 6 décembre 2019 sur l'appel de la défenderesse. Elle a partiellement accueilli cet appel. La défenderesse est désormais condamnée à payer 7'140 fr. avec intérêts au taux de 5% par an dès le 30 juin 2016. Le certificat de travail final établi par la défenderesse le 30 septembre 2016 est par ailleurs validé, à ceci près que la Cour y ordonne la suppression d'une phrase. E. Agissant par la voie du recours en matière civile, la demanderesse saisit le Tribunal fédéral de conclusions qui tendent pour l'essentiel à la confirmation du jugement de première instance. L'indemnité de 21'420 fr. doit porter intérêts dès le 30 juin 2016 seulement. Le certificat de travail doit être rédigé selon ce jugement, mais au passé composé plutôt qu'au présent. La défenderesse conclut au rejet du recours.